hdu 1002

题目概述

给定两个正整数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 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

Case 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", &times);//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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值