NEUQACM OJ1018: A+B again
Posted dearvee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NEUQACM OJ1018: A+B again相关的知识,希望对你有一定的参考价值。
题目描述
谷学长有一个非常简单的问题给你,给你两个整数A和B,你的任务是计算A+B。
输入
输入的第一行包含一个整数T(T<=20)表示测试实例的个数,然后2*T行,分别表示A和B两个正整数。注意整数非常大,那意味着你不能用32位整数来处理。你可以确定的是整数的长度不超过1000。
输出
对于每一个样例,你应该输出两行,第一行是"Case #:",#表示第几个样例,第二行是一个等式"A+B=Sum",Sum表示A+B的结果。注意等式中有空格。
样例输入
2
1 2
112233445566778899 998877665544332211
样例输出
Case 1: 1 + 2 = 3
Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110
提示
大数加法问题,在大数运算里面相对还算简单,不过对初学者博主来说,思路清晰,不过写代码能力明显就有点跟不上了。
下面我们来分析下吧:
前面的Case什么的只要把相应已知数据输出即可,下面我们重点来分析下加法的结果
首先我们看他的输入,是连续输入,即这个大数字各个位之间是没有空格的,这就意味着用整型的数组难以实现数据的输入问题。因此我们考虑用字符型数组解决输入问题。
这里方便起见;我们输入字符数组a为“98”,b为“9” 来分析下思路。
原理就是模拟小学加法,要做加法,首先每位数字应对齐,才可对应相加。因此,我们考虑定义字符数组 char c[1001]来转移并对齐a,b中的元素;
cin>>a; "98"
代码如下:
#include<iostream> #include<cstring> using namespace std; char a[1001],b[1001]; void Add()//字符加法 { char c[1001]; memset(c,\'0\',1001); for(int i=0;i<strlen(a);i++)//对齐 { c[i]=a[strlen(a)-1-i]; } memset(a,\'0\',1001); for(int i=0;i<strlen(b);i++) { a[i]=b[strlen(b)-1-i]; } for(int i=0;i<1000;i++) { a[i]+=c[i]-\'0\'; if(a[i]>\'9\') { a[i]-=10; a[i+1]++; } } } int main() { int T,n=0; cin>>T; while(T--) { n++; memset(a,\'0\',1001); memset(b,\'0\',1001); cin>>a>>b; cout<<"Case "<<n<<":"<<endl; cout<<a<<" + "<<b<<" = "; Add(); int k; for(k=1000;k>=0;k--)//排前导0 { if(a[k]!=\'0\') {break;} } for(int i=k;i>=0;i--) { cout<<a[i]; } cout<<endl; } return 0; }
以上是关于NEUQACM OJ1018: A+B again的主要内容,如果未能解决你的问题,请参考以下文章
(状压) Brush (IV) (Light OJ 1018)