击鼓传花(flower.cpp)
明明最近经常在教室里跟同学一起玩击鼓传花的游戏,规则是第n个拿到花的小朋友必须说出n!最后一位非0 的数字,如此循环游戏,如果谁讲错了就得罚唱一支歌曲。
经过几次游戏,明明认为只要把前一个小朋友说得数字去乘以n,说出得到的数的最后一位非0的数字就可以了,可惜明明这次轮到了第15个,结果被罚了唱歌(应该是8,但是HC小朋友却说了3)。
明明不希望这样的事情再次发生,所以希望你能编写一个程序,能够计算出n!的最后一位非0的数字。
输入
输入有5行,第I(1≤i≤5)行是一个n(1≤n≤10100,10的100次幂)。
输出
输出有5行。
第I行对应输入中第I行的n的阶乘的最后一位非0的数字。
样例输入
11
12
13
14
15
样例输出
8
6
8
2
8
此题看数据范围——10的100次方!所以用高精度,先用浮点数算阶乘,再转换为字符数组
参考代码:
#include <iostream>
#include <stdlib.h>
#define N 100
using namespace std;
double f(int n) //计算阶乘
{
double s=1.0;
for(int i=1;i<=n;i++)
{
s=s*i;
}
return s;
}
char p(double s)
{
char n='0',m[N];
int i=0;
gcvt(s,101,m); //双精度浮点型转字符数组的库函数
while(m[i++]!='.');
for(int k=i-2;k>=0;k--) //求出得到的数的最后一位非0的数字
{
n=m[k];
if(n!='0')
break;
}
return n;
}
int main()
{
freopen("flower.in","r",stdin);
freopen("flower.out","w",stdout);
int n[5];
double s;
char m;
for(int i=0;i<5;i++)
cin>>n[i];
for(int i=0;i<5;i++)
{
s=f(n[i]);
m=p(s);
cout<<m<<endl;
}
}