zwh1481017739 发表于 2019-12-13 12:40:15

阶乘

  一个整数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
自己写的数字大了之后就实现不了这个功能了。

Croper 发表于 2019-12-13 12:51:08

那显然是你程序写的问题啊,既然只要求最右边的数,那么肯定不是让你硬乘的

zwh1481017739 发表于 2019-12-13 14:24:56

Croper 发表于 2019-12-13 12:51
那显然是你程序写的问题啊,既然只要求最右边的数,那么肯定不是让你硬乘的

所以我求助呀。。。。

Croper 发表于 2019-12-13 16:45:40

那么你的想法是什么呢?

pheron 发表于 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;
}

jackz007 发表于 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>

zwh1481017739 发表于 2019-12-13 20:36:36

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

谢谢
页: [1]
查看完整版本: 阶乘