上一个帖子发出后,收到很多种修改程序的留言,现将搜集到的所有答案罗列出来供大家研讨。
在教材下篇 / C程序设计训练 / 第一层次 / 程序填空 / 第15题:
函数void add(char add1[],char add2[],char sum[])模拟手工加法运算过程(低位对齐,从低位向高位逐位相加,满十进一)。其中参数add1和add2均保存数字字符串,分别作为第一加数、第二加数,sum以字符串形式保存加法和。例如字符串"9045"和"7916"经add函数处理后,得到字符串"16961";"50345"和"4178"经add函数处理后,得到字符串"54523"。
第一种修改方法:在原程序基础上修改,改动少,符合原程序设计思想。
#include
#include
void add(char add1[],char add2[],char sum[]){
int len1,len2,len3;
int i,carry;
len1=strlen(add1);
len2=strlen(add2);
len3=len1
if(【1】) {
for(i=len1;i>=0;--i)
add1[i+len2-len1]=add1[i];
for(i=0; i
add1[i]='0';
}
if(len1>len2) {
for(i=len2;i>=0;--i)
add2[i+len1-len2]=add2[i];
for(i=0; i
add2[i]='0';
}
carry=0;
sum[len3]=0;
for(i=len3-1;i>=0;--i){
sum[i]=【2】
carry=sum[i]/10;
sum[i]=sum[i]%10+'0';
}
if(carry!=0){
for(i=len3;i>=0;--i)
sum[i+1]=sum[i];
sum[0]=carry+'0';
}
}
int main(){
char add1[10]={"50345"},add2[10]={"4178"},sum[11];
add(add1,add2,sum);
puts(sum);
return 0;
}
第二种修改方法,改变源程序设计思路,不再补'0'对齐,而是直接运算。程序如下:
#include
#include
void add_2(char add1[],char add2[],char sum[]){
int i,j,k,l,carry;
i=strlen(add1)-1;
j=strlen(add2)-1;
l=k=(i>j ? i:j)+1;
sum[k--]=0;
for(carry=0;i>=0 && j>=0;--i,--j,--k){
sum[k]= add1[i]-'0'+add2[j]-'0'+carry;;
carry=sum[k]/10;sum[k]=sum[k]%10+'0';
}
for(;i>=0;--i,--k){
sum[k]=add1[i]-'0'+carry;
carry=sum[k]/10;sum[k]=sum[k]%10+'0';
}
for(;j>=0;--j,--k){
sum[k]=add2[j]-'0'+carry;
carry=sum[k]/10;sum[k]=sum[k]%10+'0';
}
if(carry!=0){
for(k=l;k>=0;--k)
sum[k+1]=sum[k];
sum[0]= '1';
}
}
int main(){
char add[10][10]={{"1234"},{"4321"},
{"9876"},{"6789"},
{"9876"},{"1"},
{"12"},{"4008"},
{"9976"},{"25"}};
char sum[11];
int i;
for(i=0;i
add_2(add[i],add[i+1],sum);
printf("%s\t+%s\t=%s\n",add[i],add[i+1],sum);
}
return 0;
}
第三种修改方法与第二种修改方法类似,但程序更为简洁。
#include
#include
void add(char add1[],char add2[],char sum[]){
int i,j,k,l,carry;
i=strlen(add1)-1;
j=strlen(add2)-1;
l=k=(i>j ? i:j)+1;
sum[k--]=0;
carry=0;
while (i>=0 || j>=0) {
if (i
carry = add2[j]-'0'+carry;
}else if (j
carry =add1[i]-'0'+carry;
}else {
carry =add1[i]-'0'+add2[j]-'0'+carry;
}
sum[k--]=carry%10+'0';
carry=carry/10;
i--; j--;
}
if(carry!=0){
for(k=l;k>=0;--k)
sum[k+1]=sum[k];
sum[0]='1';
}
}
int main(){
char add1[10]={"85"},add2[10]={"11111115"},sum[11];
add(add1,add2,sum);
puts(sum);
return 0;
}
大家是否还有其他想法?请留言。
领取专属 10元无门槛券
私享最新 技术干货