版权声明:ACM代码随意转载。算法描述需备注来源。谢谢合作。 https://blog.csdn.net/Sensente/article/details/90118169
杭电1002 http://acm.hdu.edu.cn/showproblem.php?pid=1002
题目大意:大数相加。
思路 :用字符串模拟,每次从后往前同位相加,结果大于等于10 前位进一。
考虑三种情况:
一、
a串长度大于b串。
二、
b串长度大于a串。
三、
a、b串长度相等。
对于第一、二种情况。
我们需要将两串字符串进行对齐处理。即用长度较短的字符串去对齐长度较长的。然后将短串前位全部置0对齐。然后直接进行加减即可。
对于第三种情况。
需要将a、b串同时后移一位以防相加会产生进位。
对于第三种情况的输出,需要特判前置是否为0,若是则从后一位开始输出。
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <cmath>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
int n;
char a[1005];
char b[1005];
int c[1005];
char ax[1005];
char bx[1005];
bool f; //f作为进位判断
int k;
int main() {
while(cin >> n) {
for(k = 1;k <= n ;k++) {
//初始化
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(ax,0,sizeof(ax));
memset(bx,0,sizeof(bx));
f = 0;
cin >> a;
cin >> b;
int lena = strlen(a);
int lenb = strlen(b);
//第一种情况
if(lena > lenb) {
for(int i = lena - 1,j = lenb - 1;i >= 0,j >= 0;i--,j--) {
bx[i] = b[j];
}
for(int i = 0;i < lena - lenb;i++) {
bx[i] = '0';
}
for(int i = lena - 1; i >= 0; i--) {
if (!f)
c[i] = (a[i] - '0') + (bx[i] - '0');
if (f) {
c[i] = (a[i] - '0') + (bx[i] - '0') + 1;
f = 0;
}
if(c[i]>=10) {
c[i] -= 10;
f = 1;
}
}
//cout<<b<<endl<<bx<<endl;
cout<<"Case "<<k<<":"<<endl;
cout<< a << " + " << b <<" "<<"=" << " ";
for(int i = 0;i<lena;i++) {
cout<<c[i];
}cout<<endl;if(k!=n) cout<<endl;
}
//第二种情况
else if(lena < lenb) {
for(int i = lenb - 1,j = lena - 1;i >= 0,j >= 0;i--,j--) {
ax[i] = a[j];
}
for(int i = 0;i < lenb - lena;i++) {
ax[i] = '0';
}
for(int i = lenb - 1; i >= 0; i--) {
if (!f)
c[i] = (ax[i] - '0') + (b[i] - '0');
if (f) {
c[i] = (ax[i] - '0') + (b[i] - '0') + 1;
f = 0;
}
if(c[i]>=10) {
c[i] -= 10;
f = 1;
}
}
cout<<"Case "<<k<<":"<<endl;
cout<< a << " + " << b <<" "<<"=" << " ";
for(int i = 0;i<lenb;i++) {
cout<<c[i];
}cout<<endl;if(k!=n) cout<<endl;
}
//第三种情况
else if(lena == lenb) {
for(int i = lena;i > 0 ;i--) {
ax[i] = a[i - 1];
bx[i] = b[i - 1];
}
ax[0] = '0';
bx[0] = '0';
//cout<<a<<endl<<b;
for(int i = lena; i >=0 ;i--) {
if (!f)
c[i] = (ax[i] - '0') + (bx[i] - '0');
if (f) {
c[i] = (ax[i] - '0') + (bx[i] - '0') + 1;
f = 0;
}
if(c[i]>=10) {
c[i] -= 10;
f = 1;
}
}
cout<<"Case "<<k<<":"<<endl;
cout<< a << " + " << b <<" "<<"=" << " ";
if(c[0] != 0) {
for(int i = 0; i <=lena; i++ ) {
cout<<c[i];
}cout<<endl;
if(k!=n) cout<<endl;
}
else if (c[0] == 0) {
for(int i = 1; i <= lena; i++) {
cout<<c[i];
}cout<<endl;
if(k!=n) cout<<endl;
}
}
}
}
return 0;
}
本题输出注意 :
在最后一个Case输出时,只保留一个换行符。(PE原因)