鱼C论坛

 找回密码
 立即注册
查看: 1089|回复: 6

[已解决]阶乘

[复制链接]
发表于 2019-12-13 12:40:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5!=1*2*3*4*5=120,因此5!最右边的那个非0的数字是2。再如,7!=5040,因此7!最右边的那个非0的数字是4。再如,15!= 1307674368000,因此15!最右边的那个非0的数字是8。请编写一个程序,输入一个整数n(0<n<=100),然后输出n!最右边的那个非0的数字是多少。
输入:
  7
输出:
  4
自己写的数字大了之后就实现不了这个功能了。
最佳答案
2019-12-13 17:50:14
本帖最后由 jackz007 于 2019-12-13 17:56 编辑
  1. #include <stdio.h>

  2. main(void)
  3. {
  4.         int d , e , k , m                                              ;
  5.         printf("输入一个整数(1 - 100) : ")                             ;
  6.         scanf("%d" , & m)                                              ;
  7.         if(m > 0 && < 101) {
  8.                 for(d = 1 , k = 0 ; k < m ; k ++) {
  9.                         d *= (k + 1)                                   ;
  10.                         for(e = d ; e > 1 && ! (d = e % 10) ; e /= 10) ;
  11.                 }
  12.                 printf("%d\n" , d)                                     ;
  13.         } else {
  14.                 printf("超出范围\n\n")                                 ;
  15.         }
  16. }
复制代码

        编译运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 输入一个整数(1 - 100) : 100
  4. 8

  5. C:\Bin>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-13 12:51:08 From FishC Mobile | 显示全部楼层
那显然是你程序写的问题啊,既然只要求最右边的数,那么肯定不是让你硬乘的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-13 14:24:56 | 显示全部楼层
Croper 发表于 2019-12-13 12:51
那显然是你程序写的问题啊,既然只要求最右边的数,那么肯定不是让你硬乘的

所以我求助呀。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-13 16:45:40 | 显示全部楼层
那么你的想法是什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-13 17:29:48 | 显示全部楼层
本帖最后由 pheron 于 2019-12-13 17:31 编辑

说白了你也就需要每次阶乘后的最后一位数(非零)而已。把前边的统统扔掉,把最后一位的零去掉就可以了。
  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         int i, num;
  5.         int pro = 1;
  6.         scanf("%d", &num);
  7.         for(i = 1; i <= num; i++)
  8.         {
  9.                 pro = i * pro;
  10.                 if(pro % 10)                        //末位数是否为零
  11.                         pro = pro % 10;                //末位数非零则取最后一位
  12.                 else
  13.                 {
  14.                         pro = pro / 10;                //末位数为零则把零除掉
  15.                         pro = pro % 10;
  16.                 }
  17.         }
  18.         printf("%d", pro);

  19.         return 0;
  20. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-12-13 17:50:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-12-13 17:56 编辑
  1. #include <stdio.h>

  2. main(void)
  3. {
  4.         int d , e , k , m                                              ;
  5.         printf("输入一个整数(1 - 100) : ")                             ;
  6.         scanf("%d" , & m)                                              ;
  7.         if(m > 0 && < 101) {
  8.                 for(d = 1 , k = 0 ; k < m ; k ++) {
  9.                         d *= (k + 1)                                   ;
  10.                         for(e = d ; e > 1 && ! (d = e % 10) ; e /= 10) ;
  11.                 }
  12.                 printf("%d\n" , d)                                     ;
  13.         } else {
  14.                 printf("超出范围\n\n")                                 ;
  15.         }
  16. }
复制代码

        编译运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 输入一个整数(1 - 100) : 100
  4. 8

  5. C:\Bin>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-13 20:36:36 | 显示全部楼层
pheron 发表于 2019-12-13 17:29
说白了你也就需要每次阶乘后的最后一位数(非零)而已。把前边的统统扔掉,把最后一位的零去掉就可以了。

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 05:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表