代码思路算是比较简单的,注释也写的比较多,去掉我格式上的空行和注释也就40行左右,比较好理解。不过题目坑点很多,总结一下我遇到的问题:
WA:
- 0+0是否会输出0
- 输出的数字前面有没有多余的0 比如00003+0005
- 输入的两个数是什么顺序 输出就要是什么顺序 比如你输入的两个数是 1 10000009
那么最后输出就要是 1 + 10000009 = 10000010
我几个月以前写的代码会判断两个字符串哪个长 如果第二个长就把两个交换字符串交换位置 输出的时候没注意 都是长的在前面 比如上面的就会 10000009 + 1 = 10000010 WA了无数次才发现 - 注意%s + %s = 之间的几个空格
- Case 1: 注意空格、大写,冒号要是英文半角符号。注意不要出现 Case 0: 这样的问题( 很多看起来是格式的问题最后都会导致WA WA的时候一回头看看输出)
PE:
- 每组输出后面是换行+空行
- 最后一组输出后面只有换行,没有空行
贴一下C++ AC的代码(没有考虑负数),有错误或者可以改进的地方欢迎留言,渣渣的第一帖~
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void add(char a[], char b[]);
int T;//测试数据的组数
int main()
{
int a, b, i;
scanf("%d", &T);
while (T--)
{
char num1[1001], num2[1001];
scanf("%s%s", num1,num2);
add(num1, num2);
}
return 0;
}
void add(char num1[], char num2[]) //大数相加函数
{
static int N = 1;
int a[1001] , b[1001], len_a, len_b, i, j; //a充当sum数组输出
len_a = strlen(num1);
len_b = strlen(num2);
memset(a, 0, 1001 * 4); //数组初始化 也可以 = { 0 }
memset(b, 0, 1001 * 4);
//倒序储存 个位对个位 十位对十位 否则可能会错位
//储存在字符数组里 字符型转换成整型 注意减‘0’或减48
for (i = len_a - 1, j = 0; i >= 0; i--)
a[j++] = num1[i] - '0';
for (i = len_b - 1, j = 0; i >= 0; i--)
b[j++] = num2[i] - '0';
//相加 储存在数组a里
for (i = 0;i < (len_a>len_b?len_a:len_b); i++)
{
a[i] += b[i];
if (a[i] >= 10) //满10
{
a[i] -= 10; //本位只保留个位数
a[i + 1]++; //下一位进1
}
//输出部分
//Case的C要大写 Case和1之间有空格 后面有冒号 换行
//%s + %s =
printf("Case %d:\n%s + %s = ", N++, num1, num2);
while (a[i] == 0) { i--; }//去掉前面多余的0
if (i < 0)cout << "0"; //结果=0
for (i; i >= 0; i--)
cout << a[i];
cout << endl; //每组测试数据间有空行
if (T != 0)
cout << endl; //最后一组数据之后只换行 没有空行
}