求一个思路

saintqdd 2008-10-08 03:29:09
给定连续自然数的开始A,结束B(0<A,B<=1000000),把A到B的数乘起来,乘积可以超过int32.求出这个乘积的前5个数字
比如 1*2*...10=3628800 那么前5个数字就是 36288.
...全文
70 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
riverboat 2008-10-08
  • 打赏
  • 举报
回复
晕,CSDN怎么不支持制表符。代码格式化点方便阅读:

UINT PreFive( UINT a, UINT b){
double x = 0; // 对数求和用
UINT nRet; // 返回值

for(int i =a; i <=b; i++)
x += log10(i);
if (x < 4){ // 如果数位不到5,考虑到运算精度的影响,偷个懒直接计算了
nRet = 1;
for ( int j=a; j <=b; j++) nRet *= j;
}
else{
x -= (int)x; // 把整数位换成4
x += 4;
nRet = (int) (pow(10, x));
}

return nRet;
}
riverboat 2008-10-08
  • 打赏
  • 举报
回复
我们知道:
lg(a*b*c*d*e) = lga + lgb + lgc + lgd + lge
lgx = lg(x/10000) + 4 (0的个数)

我的设想如下:把所有的数取对数相加,然后把结果前面的整数换成4 (当然要保证这个结果是比4大的),最后取幂,然后取整输出。

手边没有编译器,在Excel验算了下方法是可行的。

UINT PreFive( UINT a, UINT b){
double x = 0; // 对数求和用
UINT nRet; // 返回值

for(int i =a; i<=b; i++)
x += log10(i);
if (x < 4){ // 如果数位不到5,考虑到运算精度的影响,偷个懒直接计算了
nRet = 1;
for ( int j=a; j<=b; j++) nRet *= j;
}
else{
x -= (int)x;
x += 4;
nRet = (int) (pow(10, x));
}

return nRet;
}
太乙 2008-10-08
  • 打赏
  • 举报
回复
友情up~~
saintqdd 2008-10-08
  • 打赏
  • 举报
回复
速度太慢,1000000的介乘在有效的时间范围内是算不出来的,不知道有没有数学的方法来解决,而不是纯粹的计算
coverallwangp 2008-10-08
  • 打赏
  • 举报
回复
大数相乘,用数组存储。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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