杭电1042

题意:计算N!(0<N<=10000)

Analyse:
大数乘小数问题。还是用比较原始的模拟。这道题调试了好一段时间,真受不鸟,高人指点才发现是个低级错误,d的值没有先用temp储存而错了。

View Code
 1 #include<stdio.h>
2 #define UNIT 100000
3 typedef struct
4 {
5 __int64 key[10000];//每个key存五位
6 int digit;//每个key算作一个digit
7 }bigint;
8 main()
9 {
10 bigint carry;//用来保存相乘后的进位
11 bigint num;//每次大数相乘的结果
12 int n;
13 __int64 d,temp;//d为大数相加的进位
14 int i,j;//j为大数key的索引,i为因数
15
16 while(scanf("%d",&n)!=EOF)
17 {
18 num.key[0]=1;
19 num.digit=1;
20 for(i=1;i<=n;i++)
21 {
22 //设定carry的位数为1
23 carry.digit=1;
24 //进到"0"位的有0
25 carry.key[0]=0;
26 //相乘,进位存到carry[j+1]
27 for(j=0;j<num.digit;j++)
28 {
29 carry.key[j+1] = (i*num.key[j])/UNIT;
30 //carry的位数增一
31 carry.digit++;
32 num.key[j] = (i*num.key[j])%UNIT;
33 }
34 //初始化进位为0
35 d=0;
36 //carry各个位加上去num的各个位
37 for(j=0;j<num.digit && j<carry.digit;j++)
38 {
39 temp=d;
40 d=(carry.key[j]+num.key[j]+d)/UNIT;
41 num.key[j]=(carry.key[j]+num.key[j]+temp)%UNIT;
42 }
43 //假若num比carry位数多,而且有进位就继续加
44 for(;j<num.digit && d;j++)
45 {
46 temp=d;
47 d=(d+num.key[j])/UNIT;
48 num.key[j]=(temp+num.key[j])%UNIT;
49 }
50 //假若carry比num位数多
51 for(;j<carry.digit;j++)
52 {
53 temp=d;
54 d=(carry.key[j]+d)/UNIT;
55 num.key[j]=(carry.key[j]+temp)%UNIT;
56 if(num.key[j]!=0)
57 num.digit++;
58 }
59 if(d>0)
60 {
61 num.key[j]=d;
62 num.digit++;
63 }
64 }
65 for(j=num.digit-1;j>=0;j--)
66 printf(j==num.digit-1?"%I64d":"%05I64d",num.key[j]);
67 printf("\n");
68 }
69 }
70
71



转载于:https://www.cnblogs.com/ZShogg/archive/2012/03/27/2420058.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值