Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).
Each input file contains one test case. Each case contains a pair of integers a and b where −. The numbers are separated by a space.
For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.
-1000000 9
-999,991
我真的想的太复杂了吧......int的范围足以应对了,不必用大整数的思路去做...
但还是要学习一下处理字符串和字符串与数字的转换。
1.string.h中,strlen(s)可以直接得到字符串的长度,s可以是字符数组,strlen(s)得到‘\0‘前的字符个数。(字符数组最后一个字符必须是‘\0‘)。
2.字符数字-‘0‘可以得到int型数字。
3.m%10可以得m的个位数,m/10可以得到m的十位数。
4.测试点3和10的处理是以下代码的第37,38行,看看可能产生的进位是不是被忽略掉了。
1 #include<iostream> 2 #include<cstdio> 3 #include<string.h> 4 using namespace std; 5 struct bign{ 6 int data[10]; 7 int len; 8 int flag; 9 bign(){ 10 memset(data,0,sizeof(data)); 11 len=0; 12 flag=1; 13 } 14 }; 15 bign reverse(char s[]){ 16 bign a; 17 for(int i=strlen(s)-1,j=0;i>=0;i--) 18 { 19 if(s[i]!=‘-‘) 20 {a.data[j++]=s[i]-‘0‘; 21 a.len++; 22 } 23 else 24 a.flag=-1; 25 } 26 return a; 27 } 28 bign add(bign a,bign b){ 29 bign answer; 30 int carry=0; 31 int temp=0; 32 for(int i=0;i<a.len||i<b.len;i++){ 33 temp=a.data[i]+b.data[i]+carry; 34 carry=temp/10; 35 answer.data[(answer.len)++]=temp%10; 36 } 37 if(carry)//处理可能的进位 38 answer.data[(answer.len)++]=carry; 39 answer.flag=a.flag; 40 return answer; 41 } 42 bign subtract(bign a,bign b){ 43 bign answer; 44 45 for(int i=0;i<a.len||i<b.len;i++){ 46 if(a.data[i]<b.data[i]) 47 {a.data[i+1]--; 48 a.data[i]+=10;} 49 50 answer.data[(answer.len)++]=a.data[i]-b.data[i]; 51 } 52 while(answer.len>=2&&answer.data[answer.len-1]==0)//除掉可能出现的高位的0,且至少留一位 53 answer.len--; 54 55 return answer; 56 } 57 int compare(bign a,bign b){ 58 if(a.len>b.len) return 1; 59 else if(a.len<b.len) return -1; 60 else 61 { 62 for(int i=a.len-1;i>=0;i--) 63 {if(a.data[i]>b.data[i]) return 1; 64 if(a.data[i]<b.data[i]) return -1;} 65 } 66 67 return 0; 68 } 69 int main(){ 70 char m[10],n[10]; 71 scanf("%s%s",m,n); 72 bign a,b,c; 73 a=reverse(m); 74 b=reverse(n); 75 76 if(a.flag==b.flag)//正负号相同,做加法 77 c=add(a,b); 78 else//正负号不同,减法 79 { 80 if(a.flag<b.flag)//令a为正数,b为负数 ,方便比较 81 { bign temp; 82 temp=a; 83 a=b; 84 b=temp; 85 } 86 int com=compare(a,b); 87 if(com>=0)//绝对值大的减去绝对值小的 88 c=subtract(a,b); 89 else 90 {c=subtract(b,a);//若b的绝对值大,交换相减并添加负号 91 c.flag=-1;} 92 93 } 94 95 96 if(c.flag<0) 97 printf("%c",‘-‘); 98 for(int i=c.len-1;i>=0;i--) 99 { 100 printf("%d",c.data[i]); 101 if(!(i%3)&&i) 102 printf("%c",‘,‘); 103 } 104 105 106 return 0; 107 }
原文:https://www.cnblogs.com/wsshub/p/12402253.html