您的位置:首页 > 其它

华为oj【大数求和】

2015-09-14 15:30 387 查看
#include<iostream>
#include<string>
using namespace std;

string sumgreat(string a,string b)
{
if(a=="")
return b;
if(b=="")
return a;
//比较两个字符串的长度,长度相差gap,将较短的高位串填充gap个0达到相同长度,便于统一比较操作
int sizea=a.length();
int sizeb=b.length();
int gap=0;
if(sizea>sizeb)
{
gap=sizea-sizeb;
b.insert(b.begin(),gap,'0');//在b串开头处插入gap个‘0’
sizeb=b.length();//因为填充后字符串长度改变,所以要更新sizeb的值
}
if(sizea<sizeb)
{
gap=sizeb-sizea;
a.insert(a.begin(),gap,'0');
sizea=a.length();
}
//将求和结果保存在result中
string result="";int c=0;int i=0;int j=0;//c表示进位值,取值0或者1,0表示无相加不进位,1表示进位
for(i=sizea-1,j=sizeb-1;i>=0||j>=0;i--,j--)
{
int num1=a[i]-'0';//将字符a[i]转换为数字,例如‘2’->2;
int num2=b[j]-'0';
int sum=num1+num2+c;
c=sum/10;//计算进位值,逢10进位
result.insert(result.begin(),sum%10+'0');//sum%10计算本位值,即同位数字相加后该位置的值
//最高位在字符串开头,因为字符串已经对齐,所以i和j始终相等,当达到i==j==0时要判断是否有进位
//若有进位需要在结果的最高位填充‘1’
if(i==0&&c==1)
result.insert(result.begin(),'1');
}
//注意函数有返回值
return result;
}
int main()
{
string a,b;
while(cin>>a>>b)
{
cout<<sumgreat(a,b)<<endl;
}
return 0;
}


注意事项:
1.虽然上述代码稍微繁复,但是便于理解,步骤清晰(因为没优化,看起来很不简洁),建议理解后阅读下述代码;
2.上述程序的关键在于字符串对齐(高位补0使长度一样)和最高位进位处理

/*---------------------------------------
*   日期:2015-06-28
*   作者:SJF0115
*   时间:2014
*   题目:大数求和
*   来源:华为上机
-----------------------------------------*/
#include <iostream>
#include <string>
using namespace std;

string Add(string a,string b){
int size1 = a.size();
if(size1 == 0){
return b;
}//if
int size2 = b.size();
if(size2 == 0){
return a;
}//if
// 进位
int c = 0,num1,num2,sum;
string result = "";
for(int i = size1 - 1,j = size2 - 1;i >= 0 || j >= 0 || c > 0;--i,--j){
num1 = i >= 0 ? a[i] - '0' : 0;
num2 = j >= 0 ? b[j] - '0' : 0;
sum = num1 + num2 + c;
c = sum / 10;
result.insert(result.begin(),sum % 10 + '0');
}//for
return result;
}

int main(){
string a;
string b;
while(cin>>a>>b){
cout<<Add(a,b)<<endl;
}//while
return 0;
}

注意事项:

上述程序的设计精妙之处在于for循环,要多加理解和应用

题目:

描述:

给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B;

题目类别: 字符串

难度: 中级

运行时间限制: 10Sec

内存限制: 128MByte

阶段: 入职前练习

输入:

因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。

输出:

以字符串形式,输出一行,表示A和B的和。

样例输入:

11111111111111111111111111111111111111111111111111

22222222222222222222222222222222222222222222222222

样例输出:

33333333333333333333333333333333333333333333333333

参考了Yoona的文章http://blog.csdn.net/sunnyyoona/article/details/46675553
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: