http://poj.org/problem?id=1604
水题,求N的阶乘的最末非零数字。
截取后面几位进行下一步运算,同时注意舍去末尾的0即可。
就是注意不能只保留最后一个非零的数字进行下一步运算,理由表达不好,就是最后一位下一步运算时可能会产生0并且进位,此时最后一个非0就是进位加上原先非0的前一位了。
#include<iostream>
using namespace std;
int main()
{
long long n,m,i,j;
while (cin>>n)
{
m=1;
for (i=2;i<=n;i++)
{
m*=i;
m%=10000000;
while ((m>0)&&(m%10==0)) m/=10;//这种情况下m>0一定要加上,否则遇0死循环
}
int n1=n;
j=1;
while (n1>9)
{
n1/=10;
j++;
}
for (i=1;i<=5-j;i++) cout<<' ';
cout<<n<<" -> ";
while ((m%10==0)&&(m>0)) m/=10;
cout<<m%10<<endl;
}
return 0;
}
其实我想知道的是为毛这样当n>625时m为0.。。。。。
#include<iostream>
using namespace std;
int count(int n1)//n1的末尾0个数
{
int j=0;
while ((n1%10==0)&&(n1>0))
{
n1/=10;
j++;
}
return j;
}
int main()
{
long long n,m,i,j;
while (cin>>n)
{
m=1;
for (i=2;i<=n;i++)
{
m*=i;
m%=10000000;
if (count(m)>=3) m/=1000;
}
int n1=n;
j=1;
while (n1>9)
{
n1/=10;
j++;
}
for (i=1;i<=5-j;i++) cout<<' ';
cout<<n<<" -> ";
while ((m%10==0)&&(m>0)) m/=10;
cout<<m%10<<endl;
}
return 0;
}