华为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
相关文章推荐
- VEX Operator(操作符)
- RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库
- iOS 第三方框架-MJRefresh
- 4. 获取浏览器/元素属性
- vsftpd安装
- 【转】做好软件测试需要具备的思维方式
- 去除win10快捷方式小箭头方法
- app混淆
- 分析.pin文件时,用到的几个自定义函数
- docker 进入容器 开启一个新的bash窗口
- Win10 Build 10537预览版截图曝光 更容易激活
- linux原子操作
- Ubuntu下使用模拟器Bochs运行《Linux内核完全剖析——基于0.12内核》第3章P31 引导扇区源码boot.s的一系列步骤
- shell脚本 自定义传入参数选项
- Mysql-proxy 实现读写分离
- PHP中magic_quotes_gpc和 magic_quotes_runtime区别及其反斜线转义问题
- 正向代理与反向代理的区别【Nginx读书笔记】
- QWeb Reports
- iOS 封装BaseModel
- jQiery事件