|
沙发
楼主 |
发表于 2020-2-3 09:53:43
|
只看该作者
高精度加法的例子:假设输入两个很大的正整数,求他们的和。
第一种方法,用字符串直接计算:
分别用s1,s2,s3表示两个加数和他们的和,假设s1="89",s2="12345";那么模拟我们人的手算方法:
1、发现s1比较短,放在后面,改计算12345+89;
2、列算式,整数都靠右边对齐;
3、从右往左加:9+8=17,留下7往前进1,4+8+1=13,留下3往前进1,**
4、最高位可能还有一个进位。
5、输出s3
翻译成变成操作(这个技能很重要,人的语言和计算机语言是有区别的,就像英文和中文有区别)
1、若s1的长度小于s2的,则交换他们两个。相当于放在后面了。哪里还有这样的例子?if (s1.size()<s2.size()) swap(s1,s2);
2、s2前面补0,让它和s1一样长,相当于对齐了。而且我们人认为没有就是0,但是在字符串里面不是这样的。for(i=1;i<=l1-l2;i++) s2="0"+s2;
3、这个要做好多次,所以需要总结出通用的规律,规律总结的好,程序会简洁一些,规律要是总结错了,程序就会出问题:
从右往左 (for (i=l1-1;i>=;i--))
每一位都是加数+被加数+进位 x3=x1+x2+j;
若和>=10,向前进位 j=x3/10;x3%=10 这个很巧妙
4、最高位可能还设有进位 if (j==1) s3="1"+s3
5、这个简单cout<<s3;
这里面还有一个很大的编程问题,字符串里面存放的9,实际上是数字57,存放的5,实际上是数字53,他们加起来不是等于14的,而且字符只有一个,也不能存放14呀。
好在数字和字符有对应关系,9='9'-'0',这样字符先转成数字,然后数字相加,处理进位后再转成字符:
x1=s1i-'0' 字符转数字
x2=s2i-'0' 字符转数字
x3=x1+x2+j 数字求和
j=x3/10,x3%=10 进位处理
ch=x3+'0' 数字变字符
s3=ch+s3 字符加进字符串
结合这些分析,写出如下的程序:
- #include<iostream>
- using namespace std;
- string s1,s2,s3;
- int i,j;
- int main()
- {
- cin>>s1>>s2;
- if (s1.size()<s2.size()) swap(s1,s2);///比较长短
- int l1=s1.size();
- int l2=s2.size();
- for (int i=1; i<=l1-l2; i++) s2="0"+s2; ///短的前面添0
- s3="",j=0;///进位,和都清零,准备开始
- for (i=l1-1; i>=0; i--) ///从右往左
- {
- int x1=s1[i]-'0';///字符转数字
- int x2=s2[i]-'0'; ///字符转数字
- int x3=x1+x2+j;///加
- j=x3/10;x3%=10; ///进位处理
- char ch=x3+'0';///数字转字符
- s3=ch+s3;///加进总和,注意加在左边
- }
- if (j==1) s3="1"+s3;/// 最高位进位处理
- cout<<s3;
- return 0;
- }
复制代码
|
|