超大数阶乘问题数据表示
写一个程序,计算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不用担心溢出。
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);
}