九度OJ-1003

来源:互联网 发布:java线程的作用? 编辑:程序博客网 时间:2024/04/29 02:53
题目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,7891,234 2,345,678
样例输出:
-1111111012346912
来源:
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 identifierfreopen("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);//两数相加}elseopr2(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';}elsech1=str1[len1-j];if (len2-j<0){ch2='0';}elsech2=str2[len2-j];if (ch1=='-'){ch1='0';}if (ch2=='-'){ch2='0';}//---------------------------------------------------------------------------------------------------------------BitUp=Add(ch1,ch2,c);//从低位开始每一位相加if (BitUp>9)//有进位{BitUp-=10;c=1;//高位上1}elsec=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;//高位有借位}elsec=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,就这么地吧!

路漫漫其修远兮,吾将上下而求索!

原创粉丝点击