题号:1002
题意:
我有一个非常简单的问题要告诉你。给定两个整数 A 和 B,您的工作是计算 A + B 的总和。
Input:
输入的第一行包含一个整数 T(1<=T<=20),这意味着测试用例的数量。然后T线跟随,每行由两个正整数A和B组成。 请注意,整数非常大,这意味着你不应该使用32位整数来处理它们。您可以假定每个整数的长度不会超过 1000。
Output:
对于每个测试用例,应输出两行。第一行是"case #:",# 表示测试用例的数量。第二行是一个方程"A + B = sum",sum表示 A + B 的结果。在两个测试用例之间输出一个空白行。
Sample Input:
2
1 2
112233445566778899 998877665544332211
Sample Output:
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
题意分析:因为每个整数的位数不超过1000位,则无法用int,long int 等(都会超过其表示的最大范围),最后联想到用字符串表示,并按位相加计算出其和。
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
const int mx=1005;
int sum[mx];
char s1[mx],s2[mx];
using namespace std;
int main()
{
int t,flag=0;
cin>>t;
while(t--)
{
flag++;
memset(sum,0,sizeof(sum)); ///初始化
scanf("%s %s",s1,s2);
int n=strlen(s1); ///计算字符串长度
int m=strlen(s2); ///计算字符串长度
int i=0;
for(;;i++)
{
if(i==n||i==m) ///其中有一个长度计算完,结束循环
break;
sum[i]=sum[i]+(s1[n-i-1]-'0')+(s2[m-i-1]-'0'); ///将其中s1,s2转化位数字并相加
if(sum[i]>9)
{
sum[i+1]+=1; ///大于10进位
sum[i]=sum[i]%10;
}
}
if(n>=m) ///如果s1的长度大于或等于s2
{
for(;i<n;i++)
{
sum[i]=sum[i]+s1[n-i-1]-'0';
if(sum[i]>9)
{
sum[i+1]+=1;
sum[i]=sum[i]%10;
}
}
}
else ///如果s2的长度大于s1
{
for(;i<m;i++)
{
sum[i]=sum[i]+s2[m-i-1]-'0';
if(sum[i]>9)
{
sum[i+1]+=1;
sum[i]=sum[i]%10;
}
}
}
printf("Case %d:\n",flag);
printf("%s + %s = ",s1,s2);
if(sum[i]>0) ///最后一位有进位就输出
cout<<sum[i];
for(int j=i-1;j>=0;j--) //因为数字是按个位开始相加,最后输出时则需倒着输出
cout<<sum[j];
cout<<endl;
if(t>=1) ///格式输出,最后一组不会多隔一个空行
cout<<endl;
}
return 0;
}