从昨天下午开始调试,已调试通过。支持正数输入,目前尚不支持形如“-10”数字的输入。
代码如下:
001 #include <stdio.h>
002 #include <string.h>
003
004 int max(int a, int b)
005 {
006 if(a>b)
007 return a;
008 else
009 return b;
010 }
011
012 void AddNum(const char *front, const char *back, char *result)
013 {
014 const char *pf = front + strlen(front) - 1; //pf指向第一个数末尾,即最低位
015 const char *pb = back + strlen(back) - 1; //pb指向第二个数末尾,即最低位
016 int maxlen;
017 int vf = 0;
018 int vb = 0;
019 int c = 0; //进位值
020 int i;
021
022 maxlen = max(strlen(front),strlen(back));
023 for(i=maxlen; i>0; i--)
024 {
025 vf = 0;
026 vb = 0;
027 if((pf+1) != front)
028 {
029 vf = *pf - '0';
030 pf--;
031 }
032 if((pb+1) != back)
033 {
034 vb = *pb - '0';
035 pb--;
036 }
037 *(result+i) = (vf + vb +c) % 10 + '0';
038 c = (vf + vb + c) / 10;
039 }
040 *result = c + '0';
041 *(result+maxlen+1) = '\0'; //在最后一位加上结束符
042
043 if(*result=='0') //如果最高位没有进位,则结果左移一位
044 {
045 for(i=0; i<maxlen+1; i++)
046 {
047 *(result+i) = *(result+i+1);
048 }
049 }
050 }
051
052 void SubNum(const char *front, const char *back, char *result)
053 {
054 const char *pf_sta = front; //指向第一个数的开始
055 const char *pb_sta = back; //指向第二个数的开始
056 const char *pf_end = front + strlen(front) - 1; //指向第一个数的末尾
057 const char *pb_end = back + strlen(back) - 1; //指向第二个数的末尾
058 const char *tp = NULL;
059 int maxlen, flen, blen;
060 int i;
061 int vf = 0;
062 int vb = 0;
063 int c = 0; //借位值
064 int shift_num = 0;
065 int fsmll = 0; //前数与后数对比标志,1:前数比后数小
066
067 flen = strlen(front);
068 blen = strlen(back);
069 maxlen = max(strlen(front), strlen(back));
070
071 //比较前数与后数,如果后数比前数大,标记fsmll为1
072 if(flen < blen)
073 {
074 fsmll = 1;
075 }
076 else
077 {
078 if(flen == blen)
079 {
080 for(i=0; i<maxlen; i++)
081 {
082 if(*(pf_sta) < *(pb_sta))
083 {
084 fsmll = 1;
085 break;
086 }
087 else
088 {
089 if(*(pf_sta) == *(pb_sta))
090 {
091 pf_sta++;
092 pb_sta++;
093 }
094 else
095 {
096 break;
097 }
098 }
099 }
100 }
101 }
102
103 //如果后数比前数大,交换pf_end和pb_end,同时交换front和back
104 if(1 == fsmll)
105 {
106 tp = pf_end;
107 pf_end = pb_end;
108 pb_end = tp;
109
110 tp = front;
111 front = back;
112 back = tp;
113 }
114
115 //实现大数减小数的过程
116 for(i=maxlen-1; i>=0; i--)
117 {
118 vf = 0;
119 vb = 0;
120 if((pf_end+1) != front)
121 {
122 vf = *pf_end - '0';
123 pf_end--;
124 }
125 if((pb_end+1) != back)
126 {
127 vb = *pb_end - '0';
128 pb_end--;
129 }
130
131 if(vf < vb)
132 {
133 *(result+i) = 10 + vf - vb - c + '0';
134 c = 1;
135 }
136 else
137 {
138 if((vf-vb-c) < 0)
139 {
140 *(result+i) = 10 + vf - vb - c + '0';
141 }
142 else
143 {
144 *(result+i) = vf - vb - c + '0';
145 c = 0;
146 }
147 }
148 }
149 *(result+maxlen) = '\0';
150
151 //查找0元素的个数,用shift_num记数
152 for(i=0; i<maxlen; i++)
153 {
154 if(*(result+i) == '0')
155 {
156 shift_num++;
157 }
158 else
159 {
160 break;
161 }
162 }
163
164 //移动结果,将0元素清除
165 if(shift_num != 0)
166 {
167 if(1 == fsmll)
168 {
169 *result = '-';
170 for(i=1; i<maxlen+1; i++)
171 {
172 *(result+i) = *(result + i +shift_num - 1);
173 }
174 }
175 else
176 {
177 for(i=0; i<maxlen+1; i++)
178 {
179 *(result+i) = *(result + i + shift_num);
180 }
181 }
182 }
183 else
184 {
185 if(1 == fsmll)
186 {
187 for(i=maxlen; i>=0; i--)
188 {
189 *(result+i+1) = *(result+i);
190 }
191 *result = '-';
192 }
193 }
194 }
195
196 void main()
197 {
198 char *a = "1";
199 char *b = "1000000000000000000000000000000000000000000000000000000000002";
200 char result[200];
201 AddNum(a,b,result);
202 printf("Add result: %s\n",result);
203 SubNum(a,b,result);
204 printf("Sub result: %s\n",result);
205 }