Time Limit: 3 second
Memory Limit: 2 MB
编写程序,计算n!以十进制数形式表示的数中最右边一个非零数字,并找出在它右边有几个零。
例如:12!=1*2*3*4*5*...*12=479001600
计算结果中,数字6是12!以十进制形式表示的数中最右边一个非零数字,它的右边有2个零。(程序应该适合于n为整型数的范围)
Input
输入文件中只一个数字,表示要计算的n的值(10<=n<=10000000)。
Output
输出两个数字,分为两行。
第一行表示最右边的非零数字。
第二行表示右边零的个数。
Sample Input
12
Sample Output
6 2
【题解】
5! = 1*2*3*4*5其中4 = 2*2
-> 5!=1*2*2*2*3*5
在阶乘中 0 由 2*5获得 而最右的非零数字则是除去这样的2和5配对后剩余的因子的乘积的个位数。一边乘一边取模就可以。
【代码】
#include <iostream>
using namespace std;
int n,i2,i5,rest,number0;
//i2是2因子个数,i5是5因子个数,rest用于记录乘积的个位数
void input_data()
{
cin >> n;
}
void get_ans()
{
rest=1;
i2=0;
i5=0;
for (int i=1;i<=n;i++) //対每个数都获取它的2因子个数和5因子个数,然后分解
{
int temp = i;
while ( temp % 2 == 0)
{
temp /=2;
i2++;
}
while ( temp % 5 == 0)
{
temp /=5;
i5++;
}
rest = (rest * (temp % 10)) % 10;
//做这些工作的时候可以一边乘
}
number0 = i5;
i2 -= i5;
//直接减去5的因子个数是因为2的因子数一定大于5.
for (int i=1;i<=i2;i++)
//把剩下的2也乘进去
rest=(rest*2) % 10;
}
void output_ans()
{
cout<< rest << endl;
cout<< number0;
}
int main()
{
input_data();
get_ans();
output_ans();
return 0;
}