SunKai's Blog

I'm an OIer,I want to achieve my dream

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  22 随笔 :: 0 文章 :: 24 评论 :: 0 Trackbacks

/*
习题 92:高精度算阶乘★★
题目描述:
算出n!的完整结果,其中n!=1*2*3*...*n

输入:
多组测试数据,一行一组,每行仅一个数n
其中0<=n<=10000

输出:
输出相应的n!的结果,必须精确到个位

样例输入:
10
20
100

样例输出:
3628800
2432902008176640000
933262154439441526816992388562667004907159682643816214685929
638952175999932299156089414639761565182862536979208272237582
51185210916864000000000000000000000000

其它信息:
最后一个100!的结果由于过长,故拆分成三行,每行60字符,请见谅

难度:Easy
*/
#include<stdio.h>
#define SIZE 8000
#define DS 7998
unsigned x[SIZE],n,p,i,j,t;
int main(void)
{
    while(scanf("%d",&n)!=EOF)
    {
      p=DS; x[DS]=1; x[DS+1]=0;
      for(i=1;i<=n;i++)
      {
        p--; x[p]=0; p--; x[p]=0;
        for(j=DS;j>p;j--)
        {
          x[j]*=i; t=j+1;
          x[j]+=x[t]/100000;
          x[t]%=100000;
        }
        while(!x[p]) p++;
      }
      printf("%u",x[p]); p++;
      for(;p<SIZE-1;p++)
        printf("%05u",x[p]);
      printf("\n");
    }
    return 0;
}

posted on 2008-03-08 18:30 SunKai 阅读(917) 评论(4)  编辑 收藏 引用 所属分类: 算法习题/题解

评论

# re: 习题 92:高精度算阶乘★★ 2008-03-09 16:37 DK_jims
#include<stdio.h>
#define SIZE 8000
#define DS 7998
unsigned x[SIZE],n,p,i,j,t;
int main(void)
{
while(scanf("%d",&n)!=EOF)
{
p=DS; x[DS]=1; x[DS+1]=0;

//1到N 是1*2*3*。。。。n
for(i=1;i<=n;i++)
{
p--; x[p]=0; p--; x[p]=0;


for(j=DS;j>p;j--)
{
x[j]*=i; t=j+1;
x[j]+=x[t]/100000;
x[t]%=100000;
}
while(!x[p]) p++;
}
printf("%u",x[p]); p++;
for(;p<SIZE-1;p++)
printf("%05u",x[p]);
printf("\n");
}
return 0;
}

看不懂。。。。 我是大学生~  回复  更多评论
  

# re: 习题 92:高精度算阶乘★★ 2008-03-10 11:42 ren54
用数组来模拟大数乘法。  回复  更多评论
  

# re: 习题 92:高精度算阶乘★★[未登录] 2008-03-10 18:05 flyswift
不好!你应该先实现一个用数组来表示大整数的类,然后实现这个类的+,-,*,/等运算,不然这种代码读着真费劲呢,而且没有一点可移植性。  回复  更多评论
  

# re: 习题 92:高精度算阶乘★★ 2008-03-10 19:03 SunKai
我的所有程序均由C描述,不使用类
代码是可以移植的,毕竟其中用的全部是标准C库函数  回复  更多评论
  


标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航: