超大数阶乘问题数据表示

beyondjjw 2008-03-27 11:55:26
写一个程序,计算N(1 <=N <=50,000,000)阶乘的最右边的非零位的值。
注意:10,000,000!有2499999个零。
输入是一个数N,
输出是一个整数表示最右边的非零位的值。
如输入12(12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001,600 );
则输出6;
...全文
234 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
gotofly21 2008-04-08
  • 打赏
  • 举报
回复
不好意思,题看错了,
题可等效为多少个9!,

int f(long a)
{

int t[8]={0,0,0,0,0,0,0,0};
long s=0;
int i;
long b=a;
s=0;
while(a) //存各位数,会用到
{
t[i++]= a%10;
a =a/10;
}
a=b;


while(a>10) //存多少个9!
{
a /=10;
s +=a;
}

//9!非零末位是8,
if(s)
{
i=s%4; //8^1=8; 8^2=4;8^3=2;8^4=6;8^5=8……
switch(i)
{
case 0:
s=6;
break;
case 1:
s=8;
break;
case 2:
s=4;
break;
case 3:
s=2;
break;

defualt:
break;

}

for(i=0;i<8;i++)
{
s *=t[i]!;
}
i=0;
while(!i)
{
i=s%10;
s /=10;

}
return(i);
}

gotofly21 2008-04-08
  • 打赏
  • 举报
回复

遍历太慢
应该用概率算,末位为5(因为偶数比5多,所以每个5都会变0)和后面的0都会导致结果产生一个0,
末位为5出现次数为n/10+0.5取整
计算后面0的个数:

a位输入,s位输出
long f(a)
{
long b;
s=0;
b=a;
while(a)
{
a /=10;
s +=a;
}
s +=(b+5)/10;

return(s);
}


yaos 2008-03-31
  • 打赏
  • 举报
回复
你的算法不对
这应该用对数加而不是乘法

你的乘存在错误
或者说,你舍弃的部分可能会逐渐对结果产生影响
rushman 2008-03-29
  • 打赏
  • 举报
回复
楼上的……
dsj1314520 2008-03-29
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。


C/C++ codeint i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;

rushman 2008-03-28
  • 打赏
  • 举报
回复
瀑布汗!!!
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
northwolves 2008-03-28
  • 打赏
  • 举报
回复
比较流行的算法:

#include <iostream>
using namespace std;
int main()
{
unsigned m,n,a,r[]={6,2,4,8};
cin>>n;
m=n;

for(a=0;m;m/=5)
a+=(m%5==2)+(m%5==4)*2+m/5;
cout<<((n>1)?r[a%4]:1)<<endl;
}
northwolves 2008-03-28
  • 打赏
  • 举报
回复
效率太低,试试算100亿!
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
rushman 2008-03-28
  • 打赏
  • 举报
回复
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

int i,resu;

for(i = resu = 1; i <= 50000000L; i++){
resu *= i;
while(resu == (resu / 10) * 10)resu /= 10;
resu %= 10;
}

cout<<resu<<endl;
加载更多回复(10)

33,008

社区成员

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

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