首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

超大数阶乘有关问题数据表示

2012-02-10 
超大数阶乘问题数据表示写一个程序,计算N(1 N 50,000,000)阶乘的最右边的非零位的值。注意:10,000,000!

超大数阶乘问题数据表示
写一个程序,计算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;

[解决办法]
这不是大数运算问题,而是一个脑筋急转弯 :D
其实整个过程中,只要关心最右一个非零值就可以了。
一位十进制乘50,000,000不用担心溢出。

C/C++ code
int i,resu;for(i = resu = 1; i <= 50000000L; i++){  resu *= i;  while(resu == (resu / 10) * 10)resu /= 10;  resu %= 10;}cout<<resu<<endl;
[解决办法]
比较流行的算法:

#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;
}
[解决办法]
你的算法不对
这应该用对数加而不是乘法

你的乘存在错误
或者说,你舍弃的部分可能会逐渐对结果产生影响
[解决办法]
不好意思,题看错了,
题可等效为多少个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); 


热点排行