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