题意:计算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