题目1003:A+B
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:7298
解决:3086
-
题目描述:
-
给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。
-
输入:
-
输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。
-
输出:
-
请计算A+B的结果,并以正常形式输出,每组数据占一行。
-
样例输入:
-
-234,567,890 123,456,789 1,234 2,345,678
-
样例输出:
-
-111111101 2346912
-
来源:
- 2010年浙江大学计算机及软件工程研究生机试真题
-
#include "stdio.h" #include "stdlib.h" #include "string.h" //#define max(a,b) ((a)>(b)?(a):(b)) void opr1(char* str1,char* str2); void opr2(char* str1,char* str2); void opr3(char* str1,char* str2); int Add(char ch1,int ch2,int c); void CompareAbs(char *str1,char *str2,int *flag); int Subtract(char ch1,char ch2,int c); /*int max(int x, int y) { return ((x>y)?x:y); } */ int main() { char str1[100],str2[100];//存储两个字符串 freopen("D:\\test/input.txt","r",stdin);//该句若放在变量声明前,则会提示这些变量未定义undeclared identifier freopen("D:\\test/output.txt","w",stdout); // freopen("/mnt/hgfs/D/test/input.txt","r",stdin); while (scanf("%s %s",str1,str2)!=EOF) { if((str1[0]=='-'&&str2[0]=='-')||(str1[0]!='-'&&str2[0]!='-'))//同号的两个数 { opr1(str1,str2);//两数相加 } else opr2(str1,str2);//异号的两数相减 } return 1; } //将str1和str2从低位到高位,依次相加,并自动跳过逗号 void opr1(char* str1,char* str2) { int len,len1,len2,i,j,c,BitUp; char ch1,ch2,str3[20]; len1=strlen(str1); len2=strlen(str2); c=0; i=0; if (str1[0]=='-') { len1--; len2--; } len=max(len1,len2); for(j=1;j<=len;j++) { if(j%4==0)//跳过逗号 continue; //----------------------------位数少的补0,并且把符号位也替换为0-------------------------------------------- if (len1-j<0) { ch1='0'; } else ch1=str1[len1-j]; if (len2-j<0) { ch2='0'; } else ch2=str2[len2-j]; if (ch1=='-') { ch1='0'; } if (ch2=='-') { ch2='0'; } //--------------------------------------------------------------------------------------------------------------- BitUp=Add(ch1,ch2,c);//从低位开始每一位相加 if (BitUp>9)//有进位 { BitUp-=10; c=1;//高位上1 } else c=0; str3[i++]=(char)(BitUp+'0');//每一位相加的和赋给str3,仍以字符串的形式 } //输出两个字符串相加的结果 if (str1[0]=='-')//如果同为负,则输出负号 { putchar('-'); } if (c==1)//最高位有进位 { putchar('1'); } while (i>0) { putchar(str3[--i]);//逆向打印字符串str3 } putchar('\n'); } int Add(char ch1,int ch2,int c)//两个字符以及进位相加 { int sum; sum=ch1-'0'+ch2-'0'+c; return sum; } void opr2(char* str1,char* str2)//异号的两数相减 { char* str3; int flag,flag1,i=0; if (str1[0]=='-')//将str1的符号位去掉 { str3=str1; flag1=1; while(str3[i+1]!='\0') { str1[i]=str3[i+1]; i++; } str1[i]='\0'; } else//将str2的符号位去掉 { str3=str2; flag1=0; while(str3[i+1]!='\0') { str2[i]=str3[i+1]; i++; } str2[i]='\0'; } CompareAbs(str1,str2,&flag);//比较str1和str2绝对值的大小 if (flag==0)//如果相等 { putchar('0'); putchar('\n'); } else if (flag>0)//str1大于str2 { if (flag1==1)//str1是负数 { putchar('-'); } opr3(str1,str2);//str1减去str2,并输出 } else { if (flag1==0)//str2是负数 { putchar('-'); } opr3(str2,str1);//str2减去str1,并输出 } } void opr3(char*str1,char*str2) { char ch1,ch2,str3[20]; int len1,len2,len,j,Sub,c,i=0; len1=strlen(str1); len2=strlen(str2); len=len1; c=0; for(j=1;j<=len;j++) { if(j%4==0)//跳过逗号 continue; ch1=str1[len1-j]; if (len2-j<0)//如果str2的位数比str1小,则填'0' { ch2='0'; } else { ch2=str2[len2-j]; } Sub=Subtract(ch1,ch2,c);//位依次相减 if(Sub<0) { Sub+=10; c=1;//高位有借位 } else c=0; str3[i++]=(char)(Sub+'0');//从低位到高位存入str3 } while (str3[i-1]=='0') { i--; } while (i>0) { putchar(str3[--i]); } putchar('\n'); } int Subtract(char ch1,char ch2,int c)//每位依次相减 { int ss; ss=ch1-ch2-c; return ss; } void CompareAbs(char *str1,char *str2,int *flag)//比较两个字符串的绝对值的大小 { int len1,len2,i; len1=strlen(str1); len2=strlen(str2); *flag=0; if (len1>len2) { *flag=1; } else if (len1<len2) { *flag=-1; } else { for (i=0;i<len1;i++)//从高位到低位依次比较 { if (str1[i]==str2[i]) { continue; } else if (str1[i]>str2[i]) { *flag=1; break; } else { *flag=-1; break; } } } }
我对自己已经超级无语了,动不动就用字符串处理,这题看不少人是用long型整数处理的,比我方便多了,我花了好长时间才做出来,用例都能通过,就是还不能AC,就这么地吧!
路漫漫其修远兮,吾将上下而求索!