大数运算之加减

从昨天下午开始调试,已调试通过。支持正数输入,目前尚不支持形如“-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=maxleni>0i--)
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=0i<maxlen+1i++)
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=0i<maxleni++)
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-1i>=0i--)
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=0i<maxleni++)
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=1i<maxlen+1i++)
171             {
172                 *(result+i= *(result + i +shift_num - 1);
173             }
174         }
175         else
176         {
177             for(i=0i<maxlen+1i++)
178             {
179                 *(result+i= *(result + i + shift_num);
180             }
181         }
182     }
183     else
184     {
185         if(1 == fsmll)
186         {
187             for(i=maxleni>=0i--)
188             {
189                 *(result+i+1= *(result+i);
190             }
191             *result = '-';
192         }
193     }
194 }
195
196 void main()
197 {
198     char *a = "1";
199     char *= "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 }

永不止步步 发表于02-28 15:25 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308417个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号