求思路

saintqdd 2008-10-08 03:32:53
给定连续自然数的开始A,结束B(0 <A,B <=1000000),把A到B的数乘起来,乘积可以超过int32.求出这个乘积的前5个数字
比如 1*2*...10=3628800 那么前5个数字就是 36288.
...全文
167 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
adrian_yang84 2008-10-08
  • 打赏
  • 举报
回复
我有个思路,楼主试下吧。设A为m位数,B为n位数,A乘B:现假设A的末位不知道,最小为0,最大为9,所以这两种情况下乘积差为(9-0)*B,小于10B,所以乘积的最多末(n+1)位有问题,前面的位是有保证的。因此可以先用对数的方法,算出A到B乘积有多少位,再用上面的方法按照精度将乘数的末几位取0,这样就不参与运算了,满足int32的要求。
江王 2008-10-08
  • 打赏
  • 举报
回复
硬来是不行的, 用对数
log(A1*A2*An) = log(A1)+log(A2)+...log(An)
结果 Fn 估计也会很大,但将减去一些整数部分, 使得
5 <= Fn < 6
比如 3296.3242 --> 5.3242
再求反对数, 整数部分5即是你要的结果
saintqdd 2008-10-08
  • 打赏
  • 举报
回复
double显然不行,你去算算1000000!,不是double能放的下的
rover___ 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 galois_godel 的回复:]
直接用double,
[/Quote]
没有什么障碍
galois_godel 2008-10-08
  • 打赏
  • 举报
回复
直接用double,
conquersky 2008-10-08
  • 打赏
  • 举报
回复
建议 去看看mod 相乘运算的法则 ,你就回了~~

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧