首页 > 代码库 > 高精度1--加法

高精度1--加法

高精度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 /*
 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 } 

 

高精度1--加法