高精度1--加法

一、心得

自己写的东西才是自己的,看一百遍都不一定看得会

 

//没有考虑到输出的时候a[0]是0的情况

//边界情况多多考虑

 

二、题目及分析

计算12345678987755+4324324324


/*

高精度加法:

模拟手算

1、初始化:数组和倒序

2、加:相加和进位

3、输出:倒序

*/

三、代码及结果

自己的:



1 /*
2 高精度加法:
3 模拟手算
4 1、初始化:数组和倒序
5 2、加:相加和进位
6 3、输出:倒序
7 */
8 #include <iostream>
9 #include <string>
10 #define Max 105
11 using namespace std;
12 /*
13 s=12345
14 length=5
15 a[5] 0-4
16 1 s4
17 2 s3
18 3 s2
19 4 s1
20 5 s0
21 */
22 //初始化字符串:变为int数组和倒序
23 void init(string &s,int (&a)[Max]){
24 int length=s.length();
25 a[0]=length;
26 for(int i=1;i<=length;i++){
27 a[i]=s[a[0]-i]-'0';//a[0]这里注意下
28 }
29
30 return ;
31 }
32 //显示数组
33 void printArray(int (&a)[Max]){
34 //print
35 for(int i=1;i<=a[0];i++){
36 //cout<<a[i]<<" ";
37 printf("%3d ",a[i]);
38 }
39 cout<<endl;
40 }
41 //加操作
42 void add(int (&a)[Max],int (&b)[Max]){
43 if(a[0]<b[0]) a[0]=b[0];
44 //逐位相加
45 for(int i=1;i<=a[0];i++){
46 a[i]+=b[i];
47 }
48 printArray(a);
49 //处理进位
50 for(int i=1;i<=a[0];i++){
51 a[i+1]+=a[i]/10;
52 a[i]=a[i]%10;
53 }
54 printArray(a);
55 //看最高位是否进位,看相加之后是否边长
56 if(a[a[0]+1]>0) a[0]++; //修正a的位数(a+b最多只能进一位)
57 }
58 //输出结果
59 void outputAns(int (&a)[Max]){
60 //没有考虑到输出的时候a[0]是0的情况
61 //边界情况多多考虑
62 if(a[0]==0){cout<<0<<endl;return;}
63 for(int i=a[0];i>=1;i--){
64 cout<<a[i];
65 }
66 cout<<endl;
67 }
68
69 int main(){
70 freopen("in.txt","r",stdin);
71 string s1,s2;
72 cin>>s1>>s2;
73 cout<<s1<<" "<<s2<<endl;
74 //初始化数字串s1
75 int a[Max]={0};//要初始化为0
76 init(s1,a);
77 printArray(a);
78 //初始化数字串s2
79 int b[Max]={0};//要初始化为0
80 init(s2,b);
81 printArray(b);
82 //a和b数组相加
83 add(a,b);
84 //输出结果
85 outputAns(a);
86 return 0;
87 }


高精度1--加法_初始化

 

书上的:



1 /*
2 高精度就是在模拟手算
3 用计算机模拟手算的方法就可以得到各种高精度
4 */
5 #include <iostream>
6 using namespace std;
7 //初始化字符数组,
8 //将数串s转换为数组a,并倒序存储.
9 void init(int a[]){
10 string s;
11 cin>>s;//读入字符串
12 a[0]=s.length(); //用a[0]计算字符串s的位数
13 for(int i=1;i<=a[0];i++){
14 a[i]=s[a[0]-i]-'0';//将数串s转换为数组a,并倒序存储.
15 }
16 }
17 //高精度加法
18 void jia(){
19 int i,k;
20 if(a[0]<b[0]) a[0]=b[0];//确定加法最大位数
21 for(i=1;i<=a[0];i++)a[i]+=b[i]; //逐位相加
22 for(i=1;i<=a[0];i++)
23 {
24 a[i+1]+=a[i]/10;
25 a[i]%=10;
26 } //处理进位
27 if(a[a[0]+1]>0)a[0]++;//修正a的位数(a+b最多只能进一位)
28 }
29 //输出
30 void print(int a[]) //打印输出
31 {
32 int i;
33 if(a[0]==0){cout<<0<<endl;return;}
34 for(i=a[0];i>=1;i--)cout<<a[i];
35 cout<<endl;
36 }
37
38 int main(){
39 return 0;
40 }