鱼C论坛

 找回密码
 立即注册
查看: 1333|回复: 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 编辑
#include <stdio.h>

main(void)
{
        int d , e , k , m                                              ;
        printf("输入一个整数(1 - 100) : ")                             ;
        scanf("%d" , & m)                                              ;
        if(m > 0 && < 101) {
                for(d = 1 , k = 0 ; k < m ; k ++) {
                        d *= (k + 1)                                   ;
                        for(e = d ; e > 1 && ! (d = e % 10) ; e /= 10) ;
                }
                printf("%d\n" , d)                                     ;
        } else {
                printf("超出范围\n\n")                                 ;
        }
}
        编译运行实况:
C:\Bin>g++ -o x x.c

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

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 编辑

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

int main(void)
{
        int i, num;
        int pro = 1;
        scanf("%d", &num);
        for(i = 1; i <= num; i++)
        {
                pro = i * pro;
                if(pro % 10)                        //末位数是否为零
                        pro = pro % 10;                //末位数非零则取最后一位
                else
                {
                        pro = pro / 10;                //末位数为零则把零除掉
                        pro = pro % 10;
                }
        }
        printf("%d", pro);

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

使用道具 举报

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

main(void)
{
        int d , e , k , m                                              ;
        printf("输入一个整数(1 - 100) : ")                             ;
        scanf("%d" , & m)                                              ;
        if(m > 0 && < 101) {
                for(d = 1 , k = 0 ; k < m ; k ++) {
                        d *= (k + 1)                                   ;
                        for(e = d ; e > 1 && ! (d = e % 10) ; e /= 10) ;
                }
                printf("%d\n" , d)                                     ;
        } else {
                printf("超出范围\n\n")                                 ;
        }
}
        编译运行实况:
C:\Bin>g++ -o x x.c

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

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-10-5 03:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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