求牛人解答...
给定正整数N(N < 5000),计算并输出N!的最后一位非0数字。例如,当N等于5时输出2。
#include<stdio.h>
long double func(int i)
{
if(i==0||i==1)
return 1;
else
return(i*func(i-1));
}
int LastNum(int a) //可惜不能定义为long double型,不然范围可以稍微大点,算到170!的最后一位非零数
{
for(int i=0;i<1000;i++)
{
if(a%10==0&&(a=a/10)%10!=0)
break;
}
return(a%10);
}
void main()
{
int a,flag;
while(flag)
{
scanf("%d",&a);
if(a>170||a<0)
flag=1;
else
flag=0;
}
printf("最后一位非零数为:%d\n",LastNum(func(a)));//受到“只有int才能取整取余”限制,只能算到12!的最后一位非零数
printf("%d!=%.0lf\n",a,func(a)); //a为long double型,最大能取170,否则溢出
}
我的问题:如何将这种很大无规律阶层数存起来并操作,避免int取整取余问题?
[解决办法]
百度里有计算阶乘的C代码,可以作为验证使用,如下:
#include <stdio.h>#define N 5000 // modify it to hold larger number int main(void){int n, i, j, s, up, f[N] = {0};scanf("%d", &n);for (i = 2, f[0] = 1; i <= n; i++)for (j = up = 0; j < N; j++) {s = f[j] * i + up;f[j] = s % 10;up = s / 10; }for (i = N-1; f[i] == 0; i--);for (; i >= 0; i--) printf("%d", f[i]) ;printf("\n");return 0;}