阶乘
一个整数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
那显然是你程序写的问题啊,既然只要求最右边的数,那么肯定不是让你硬乘的
所以我求助呀。。。。 那么你的想法是什么呢? 本帖最后由 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: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> pheron 发表于 2019-12-13 17:29
说白了你也就需要每次阶乘后的最后一位数(非零)而已。把前边的统统扔掉,把最后一位的零去掉就可以了。
谢谢
页:
[1]