题目概述
给定两个正整数num1和num2,求其和sum
输入
第一行times,其后times行,每行两个数num1,num2
限制
1<=times<=20;num1,num2>0;num1,num2长度<=1000
输出
每组输出有两行,第一行为Case #,其中#代表第几组数据,第二行为num1 + num2 = sum,每个符号两侧有一个空格,两组输出之间有一个空行
样例输入
3
1 2
112233445566778899 998877665544332211
1 1000000000000
样例输出
Case 1:
1 + 2 = 3Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110Case 3:
1 + 1000000000000 = 1000000000001
讨论
通过率不足二成的“水题”,将数作为字符串输入,之后每数位分成一组,作为整型存放,其实要考虑的事情无非三个,一是进位,二是前导0的处理,三是非前导0的处理
题解状态
0MS ,1700K,1533B,C++
题解代码
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<set>
#include<map>
#include<string>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define maxx(a,b) ((a)>(b)?(a):(b))
#define minn(a,b) ((a)<(b)?(a):(b))
#define MAXN 26
#define memset0(a) memset(a,0,sizeof(a))
#define wa 100000000 //每个整型数的上限+1 名称没有特殊含义 随手起的
#define wb 8 //每个整型数所包含的位数
int num1[128], num2[128], sum[128];//分别用来存放处理后的三个数
char num[1002];//用于存放原始输入数据
bool f;//flag 用于控制输出间空行
void input(int *a)//将字符型拆分成多个整型数,存到a数组中
{
char c[wb] = {};//初始化空串作为中转
int p = 127;//初始化最后一个整型数的位置
int len = strlen(num);//初始化长度
for (; len - wb > 0; len -= wb, p--) {
strncpy(c, &num[len - wb], wb);//从原串中从后向前依次取8位复制到中转串
a[p] = atoi(c);//然后转化为整型数字
}
memset0(c);//由于最左端的几位不一定够8位 而复制时不会复制\0 因而需要清空一次
strncpy(c, num, len);//将最左端的几位同样处理
a[p] = atoi(c);
}
void add()//加操作
{
int c = 0;//carry 进位
for (int p = 127; p; p--) {//同样是从后往前处理
sum[p] = num1[p] + num2[p] + c;
c = sum[p] / wa;
sum[p] %= wa;
}
}
void output(int *sum)//输出 本来以为只输出sum 所以变量就叫的sum
{
bool f = 0;//flag 控制0输出
for (int p = 0; p < 128; p++) {
if (f)
printf("%08d", sum[p]);//output//不是开头的数字自然需要输出所有0
else if (sum[p]) {
f = 1;
printf("%d", sum[p]);//output//而开头的数字不能输出0
}
}
}
void fun(int times)
{
scanf("%s", num);//input
input(num1);
scanf("%s", num);//input
input(num2);
add();
printf("Case %d:\n", times);//output
output(num1);
printf(" + ");//output
output(num2);
printf(" = ");//output
output(sum);
printf("\n");//output
}
int main(void)
{
//freopen("vs_cin.txt", "r", stdin);
//freopen("vs_cout.txt", "w", stdout);
int times;
scanf("%d", ×);//input
for (int p = 0; p < times; p++) {
if (f)
printf("\n");//output
fun(p + 1);
f = 1;
memset0(num1);
memset0(num2);
memset0(sum);
memset0(num);
}
}
EOF