注意
最后一行输出仅需一个空行
markdown代码的插入符号为“ ``` ”(~)不是“ ''' ”
#include<stdio.h>
# define Maxsize 2000
int main(){
int n;
int sum;
int cut;
int a[Maxsize] = {0};
char c;
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++){
int aj=0,add=0,sum=0;
int sums[Maxsize] = {0};
while ((c=getchar())!='\n'){
if(c!=' '){
a[aj] = c-'0';
aj++;
}
else
cut = aj;
}
int len1 = cut;//第一个式子的长度
int len2 = aj-len1;//第二个式子的长度
int len1_begin = 0;
int len1_end = len1-1;
int len2_begin = len1;
int len2_end = aj-1;
int long_begin = len2_begin;
int long_end = len2_end;
int short_end = len1_end;
int short_begin = len1_begin;
if(len1 >= len2){
long_begin = len1_begin;
long_end = len1_end;
short_end = len2_end;
short_begin = len2_begin;
}
//核心算法
for(int j=long_end; j>=long_begin; j--){
if(short_end >= short_begin){//长度较短的数下标未出界
sum = a[j]+a[short_end];//将末尾对齐的两数相加
short_end--;//向前移动,计算高位
if((sum+add) >= 10){//两数相加,再加进位add的结果大于10,则产生进位,add初始为0
sums[j+1] = (sum+add)%10;//设置成j+1是为处理两数相加 位数增加的情况(2+9 = 11)
add = (sum + add)/10;
}
else{//无进位产生,将相加结果直接存入最终结果数组sums中
sums[j+1] = sum+add;
add = 0;//此时进位add为0
}
}
else{//如果长度较短的数 下标出界,则运算结果直接等于 长度较长数 注意最开始需要加上上一步运算的进位
sums[j+1] = a[j] + add;
add = 0;
}
}
if((sum+add) >= 10)//最后一步运算之后如果有进位,则结果的长度需要增加,以存放该值
sums[long_begin] = add;
int begin = long_begin;//默认有进位,前一个数不为0,需要输出,注意sums下标从long_begin+1开始存的
if(sums[begin]==0)
begin = long_begin+1;
//输出
printf("Case %d:\n",i+1);
for(int j=len1_begin;j<=len1_end;j++)
printf("%d",a[j]);
printf(" + ");
for(int j=len2_begin;j<=len2_end;j++)
printf("%d",a[j]);
printf(" = ");
for(int j=begin;j<=long_end+1;j++)
printf("%d",sums[j]);
if(i != n-1)
printf("\n\n");
else
printf("\n");
}
getchar();
getchar();
return 0;
}
网友评论