首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求牛人解答.该如何解决

2012-03-17 
求牛人解答...给定正整数N(N 5000),计算并输出N!的最后一位非0数字。例如,当N等于5时输出2。#includestdi

求牛人解答...
给定正整数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代码,可以作为验证使用,如下:

C/C++ code
#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;} 

热点排行