题目链接
题目翻译
题目描述
我有一个非常简单的问题问你:给你两个整数 A 和 B ,你的任务是计算 A + B 。
输入描述
输入的第一行包含一个整数 ,表示测试用例的数量。然后是行,每行由两个正整数和组成。注意整数非常大,这意味着你不应该使用 32 位整数来处理它们。你可以假设每个整数的长度不会超过 1000。
输出描述
对于每一个测试样例,你应该输出两行。第一行是 “Case #:
“,”#”代表该测试样例的编号。第二行是等式”A + B = Sum
“。Sum是 A + B 的和。注意等式里有一些空格。在两个测试样例间输出一个空行。
输入样例
2
1 2
112233445566778899 998877665544332211
复制代码
输出样例
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
复制代码
解题思路
题目要求两个数之和。但是由于题目所给的数据很大,即使用long long
也存不下。所以想到高精度加法。使用两个数组或字符串来分别存储两个数,之后通过一位一位相加来得出结果。详情搜索高精度算法的相关知识点。
这道题没有前导零的坑,但要特别注意题目格式要求。比如在上面的例子中,Case 1与Case 2之间有一个空行。但是Case 2的最后没有空行。
代码
重写的,推荐:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
for(int ii=1;ii<=t;ii++){
//初始化
string A,B;//为了方便读入,使用字符串A、B存储用户输入的两个数。可以理解为是字符数组
int a[10010]={0},b[10010]={0},c[10010]={0};
int len;
//输入
cin>>A>>B;
len = max(A.length() , B.length() ) + 1;//A.length() 代表A的长度
for(int i=0;i<A.length();i++)
a[A.length() - i] = A[i] - '0';//倒着存
for(int i=0;i<B.length();i++)
b[B.length() - i] = B[i] - '0';
//加法运算
for(int i=1;i<=len;i++){
c[i] += a[i] + b[i];
c[i+1] = c[i] / 10;
c[i] = c[i] % 10;
}
while( c[len]==0 && len>1 ) len--;
//输出 注意控制格式
cout<<"Case "<<ii<<":\n";
cout<<A<<" + "<<B<<" = ";
for(int i=len;i>=1;i--)
cout<<c[i];
cout<<"\n";
if(ii!=t) cout<<"\n";//当前不是最后一个样例,多输出一个空行。
}
return 0;
}
复制代码
下面是做题时写的,当时写的比较麻烦,把数字正着存;又因为格式问题WA了,下面是改正过的。
//https://vjudge.net/contest/447075#problem/A
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
void Add(char a[],char b[])
{
int i=strlen(a)-1,j=strlen(b)-1;
int c[1010];
int ctop=0;
int next=0;//保存当前位的进位数
while(i>=0&&j>=0)
{
//把两个数长度相同的部分进行相加
int sum;
sum=(int)(a[i]-'0')+(int)(b[j]-'0')+next;
c[ctop]=sum%10;
ctop++;
next=sum/10;
i--;
j--;
}
while(i>=0)
{
//如果a还没有加完
int sum=(int)(a[i]-'0')+next;
c[ctop]=sum%10;
next=sum/10;
ctop++;
i--;
}
while(j>=0)
{
//如果b还没有加完
int sum=((int)(b[j]-'0'))+next;
c[ctop]=sum%10;
next=sum/10;
ctop++;
j--;
}
if(next>0)
{
//当前仍有进位
c[ctop]=next;
}
else
ctop--;
while(ctop>=0)
{
cout<<c[ctop];
ctop--;
}
}
int main()
{
int t;
cin>>t;
int i=0;
while(t--)
{
i++;
char a[1001],b[1001];
scanf("%s",a);
scanf("%s",b);
cout<<"Case "<<i<<":\n"<<a<<" + "<<b<<" = ";
Add(a,b);
cout<<"\n";
if(t!=0)
cout<<"\n";
}
return 0;
}
复制代码
相关知识点
高精度加法
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END