您的位置:首页 > 编程语言 > C语言/C++

UVa 568: Just the facts

2013-07-25 19:49 579 查看
这题要求N!的末尾非零位,考虑用模除法保留阶乘计算中每次乘法后所得结果的最后几位数。

当遇到乘数为5的倍数时,从保留的最后几位数中分出2与乘数因子中的5配对。

阶乘做完后模10得到结果。

另:

这种方法只适合N较小的情况。
保留每次乘积的至少末5位,因为计算3125!的对饮结果时如果保留的位数过少,将没有足够的2与3125=5^5中的5匹配消去,会得到错误结果
我的解题代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int main()
{
int N;
int digit;	//用于保留乘积的末5位
int k;
while(cin >> N)
{
digit = 1;
for(int i=1; i<=N; i++)
{
k=i;
while(k%5==0)
{//从digit中除去2,消去k中的5
k = k/5;
digit = digit/2;
}
digit = (digit*k)%100000;
}
digit %= 10;
printf("%5d -> %d\n",N,digit);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UVa c++ 简单数论题