【高精度】HDU 1002 – A + B Problem II

题目链接

HDU 1002 – A + B Problem II

题目翻译

题目描述

我有一个非常简单的问题问你:给你两个整数 A 和 B ,你的任务是计算 A + B 。

输入描述

输入的第一行包含一个整数 T(1<=T<=20)T(1<=T<=20),表示测试用例的数量。然后是TT行,每行由两个正整数AABB组成。注意整数非常大,这意味着你不应该使用 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
喜欢就支持一下吧
点赞0 分享