题目:
(acmhit1002)输入A,B,C三个数,三个数的范围都在int内,可正可负,要求输出这三个数的和。
思路:
一开始的时候,我想试试longlong解决战斗,毕竟三个int加的再溢出也就能溢出一位。但是失败了……于是我以为需要老老实实的做大数加减法,于是搞了个能算两百位(应该是198)的程序。可是不管怎么上传都不对。后来没辙了网上一搜,发现……还是特么用的longlong,只是我的输入格式弄错了!我了一个去啊……我到现在都不敢确定到底是我下面这个程序有bug还是它不识别字符串输入(用a+b改出了一个字符串结果的确提示错误),总之先这样了,没有绝对正确的程序,只是你还没看出bug在哪嘛。这程序反正我现在是看不出bug在哪了……
方案:
设置最长数位为200,设置数组存储abc,符号位单独记录,不存在数组内。通过两个数的正负关系确定加减法,通过加减法+字符串长度比较+字符串大小比较确定结果的符号。按位计算结果并输出。
代码:
由于是练习场,未加任何注释。好在代码不是太长。三个数的加减法只需要调用两次这个函数就好。
void TwoNumberCaculate(char *num1,char *num2,char *res) { char *small,*large; int mark1=0,mark2=0,markres,len1,len2,i; int j=0,r_1[MAX_LEN]={0},r_2[MAX_LEN]={0},r_r[MAX_LEN]={0},of=0; if(num1[0]==‘-‘) mark1=1; if(num2[0]==‘-‘) mark2=1; len1=strlen(num1)-mark1; len2=strlen(num2)-mark2; for(i=len1-1;i>=0;--i) r_1[i]=num1[len1-1+mark1-i]-‘0‘; for(i=len2-1;i>=0;--i) r_2[i]=num2[len2-1+mark2-i]-‘0‘; if(mark1==mark2) { markres=mark1; for(i=0;i<=len1-1+mark1||i<=len2-1+mark1;++i) { r_r[i]=r_1[i]+r_2[i]; } for(i=0;i<=len1-1+mark1||i<=len2-1+mark1;++i) { r_r[i]+=of; of=r_r[i]/10; r_r[i]%=10; } r_r[i]+=of; } else { if(len1>len2||(len1==len2&&strncmp(num1+mark1,num2+mark2,len1)==1)) { markres=mark1; for(i=0;i<=len1-1+mark1;++i) { r_r[i]=r_1[i]-r_2[i]; if(r_r[i]<0) { r_r[i]+=10; --r_1[i+1]; } } } else if(len2>len1||(len2==len1&&strncmp(num1+mark1,num2+mark2,len1)==-1)) { markres=mark2; for(i=0;i<=len2-1+mark1;++i) { r_r[i]=r_2[i]-r_1[i]; if(r_r[i]<0) { r_r[i]+=10; --r_2[i+1]; } } } else { res[0]=‘0‘; res[1]=‘\0‘; return ; } } if(markres==1) res[0]=‘-‘; for(i=MAX_LEN-1;r_r[i]==0;--i) ; j=0; for(;i>=0;--i,++j) res[j+markres]=r_r[i]+‘0‘; res[j+markres]=‘\0‘; printf("Res=%s\n",res); }