ZOJ 1962大数运算题解,题目虽不太难但是细节比较烦一不小心就出错。
1 #include<stdio.h>
2 #include<string.h>
3
4 int num[102], num2[102], low[102], high[102];
5 int cmp(int x[], int y[])//判断函数用作判断超过区域范围。
6 {
7 int i, lenx, leny;
8 lenx = leny = 101;
9 while(x[lenx] == 0)
10 {
11 lenx--;
12 }
13 while(y[leny] == 0)
14 {
15 leny--;
16 }
17 if(lenx < leny) return -1;
18 if(lenx > leny) return 1;
19 for(i=lenx; i>=0; i--)//一开始这里出错了纠结了N久看别人写的和自己的一样,后来终于发现自己把i--写成了i++,我晕啊,令人蛋疼的错误,自己太粗心了
20 {
21 if(x[i] > y[i]) return 1;
22 if(x[i] < y[i]) return -1;
23 }
24
25 return 0;
26 }
27
28 void getadd()//分别将两个数相加。
29 {
30 int i, len_num, add, temp[102];
31
32 len_num = 101;
33 while(num[len_num] == 0)
34 {
35 len_num--;
36 }
37 for (i=0; i<=len_num+1; i++)
38 {
39 temp[i] = num[i];
40 }
41
42 add = 0;
43 for (i=0; i<=len_num+1; i++)//加过后结果放在num数组里。
44 {
45 num[i] += num2[i] + add;
46 if(num[i] > 9)
47 {
48 add = 1;
49 num[i] -= 10;
50 }
51 else
52 add = 0;
53 }
54 for(i=0; i<=len_num+1; i++) 把原来num数组里的元素放到num2数组里
55 {
56 num2[i] = temp[i];
57 }
58 }
59
60 int main()
61 {
62 int i, k;
63 char a[102], b[102], len1, len2;
64
65 while(scanf("%s%s", a, b) != EOF)
66 {
67 if(a[0]=='0' && b[0]=='0')
68 break;
69 for (i=0; i<102; i++)//将几个数组初始化为0,一边与方便存储数据,这非常重要
70 {
71 low[i] = high[i] = 0;
72 num[i] = num2[i] = 0;
73 }
74
75 k = 0;
76 num[0] = num2[0] = 1;
77 len1 = strlen(a);
78 len2 = strlen(b);
79
80 for(i=0; i<len1; i++)//将数组逆序以便于做加法运算
81 {
82 low[i] = a[len1-1-i] - '0';
83 }
84 for(i=0; i<len2; i++)
85 {
86 high[i] = b[len2-1-i] - '0';
87 }
88 while(cmp(num, low) < 0)//判断num是否小于下边界
89 {
90 getadd();
91 }
92 while(cmp(num, high) <= 0)//判断num是否超出上边界
93 {
94 k++;
95 getadd();
96 }
97 printf("%d\n", k);
98 }
99
100 return 0;
101 }