高精度加法
思路:
模拟竖式加法。
用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 }

浙公网安备 33010602011771号