击鼓传花

来源:互联网 发布:淘宝店铺怎样修改店名 编辑:程序博客网 时间:2024/04/24 06:36

击鼓传花(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;
 }
}