高精度加法

思路:

模拟竖式加法。

用char数组存储输入的数字串的每一位,转为Int后利用循环从低位开始对两数进行加法,个位作为结果,十位作为进位,依次类推。注意最后进位的大小,若进位不为零,则直接将进位存到最高位。

数字字符转为数字:用数字字符直接减去‘0’(ASCII码为48)就可以完成转换。

可以用结构体数组存储转换成int后的数字串,用结构体变量记录长度。注意初始化结构体。

char数组低位存储的是数的高位,进行类型转换时,(最好)将其逆序存储(方便计算),即:结构体数组的低位存储数的低位。

如果两数为负数,则记录负号后,将数字转为正数进行计算,最后加上负号即可。

如果两数有一方为负数,则转换成高精度减法。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 struct bign{
 5     int b[1000];
 6     int len;
 7     bign(){
 8         memset(b,0,sizeof(b));
 9         len=0;
10     }
11 };
12 
13 bign change(char str[])//高低位转换 
14 {
15     bign c;
16     c.len=strlen(str);
17     for(int i=0;i<c.len;i++)
18     {
19         c.b[i]=str[c.len-i-1]-'0';
20     }
21     return c;
22 }
23 
24 bign add(bign a,bign b)
25 {
26     bign c;
27     int carry=0;//进位
28     for(int i=0;i<a.len || i<b.len;i++)
29     {
30         int temp=a.b[i]+b.b[i]+carry;
31         c.b[c.len++]=temp%10;
32         carry=temp/10;
33     }
34     if(carry!=0)
35     {
36         c.b[c.len++]=carry;
37     }
38     return c;
39 }
40 
41 void print(bign a)
42 {
43     for(int i=a.len-1;i>=0;i--)
44     {
45         printf("%d",a.b[i]);
46     }
47 }
48 
49 int main()
50 {
51     char str1[1000],str2[1000];
52     scanf("%s%s",str1,str2);
53     bign a=change(str1);
54     bign b=change(str2);
55     print(add(a,b));
56     return 0;
57 }
View Code

 

posted @ 2022-04-11 22:25  顾南  阅读(36)  评论(0)    收藏  举报