称不上算法的算法-1.简单的高精度计算

一、高精度加法

基本

HRBUST1550

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 using namespace std;
 6 int a[110];
 7 int b[110];
 8 int main(void){
 9     int n;
10     scanf("%d",&n);
11     for(int l=0;l<n;l++){
12         string s1;
13         string s2;
14         cin>>s1;//*********************************
15         cin>>s2;//        char数组初始化读入
16         memset(a,0,sizeof(a));//int数组归0化读入
17         memset(b,0,sizeof(b));//*******************
18         a[0]=s1.length();//长度
19         b[0]=s2.length();//长度
20         for(int i=1;i<=a[0];i++)//****************
21             a[i]=s1[a[0]-i]-'0';//倒叙存入数组
22         for(int i=1;i<=b[0];i++;23             b[i]=s2[b[0]-i]-'0';//****************
24         int k=a[0]>=b[0]?a[0]:b[0];//求出和的预测位数
25         for(int i=1;i<=k;i++){//******************
26             a[i+1]+=(a[i]+b[i])/10;
27             a[i]=(a[i]+b[i])%10;//核心计算
28         }//***************************************
29         if(a[k+1]!=0)
30             k++;
31         for(int j=k;j>0;j--)
32             cout<<a[j];
33         cout<<endl;
34     }
35 }

变种(20进制) 

HRBUST1624

 1 #include<cstring>
 2 #include<iostream>
 3 #include<stdio.h>
 4 int a[210];
 5 int b[210];
 6 using namespace std;
 7 int main(void){
 8     string s1;
 9     string s2;
10     while(cin>>s1){
11         cin>>s2;
12         memset(a,0,sizeof(a));
13         memset(b,0,sizeof(b));
14         int nla=0;
15         while(s1[nla]=='A')
16             nla++;
17         int nlb=0;
18         while(s2[nlb]=='A')
19             nlb++;
20         a[0]=s1.length()-nla;
21         b[0]=s2.length()-nlb;
22         for(int i=1;i<=s1.length();i++)
23             a[i]=s1[s1.length()-i]-'A';
24         for(int i=1;i<=s2.length();i++)
25             b[i]=s2[s2.length()-i]-'A';
26         int k=a[0]>=b[0]?a[0]:b[0];
27         for(int i=1;i<=k;i++){
28             a[i+1]+=(a[i]+b[i])/20;
29             a[i]=(a[i]+b[i])%20;
30         }
31         if(a[k+1] !=0)
32             k++;
33         for(int j=k;j>0;j--)
34             printf("%c",a[j]+'A');
35         cout<<endl;
36     }
37 }

 应用1-大斐波数

HDU1715

 1 #include<stdio.h>
 2 #include<cstring>
 3 using namespace std;
 4 int a[2000];
 5 int b[2000];
 6 int c[2000];
 7 void addfun(int x[],int y[],int z[]);
 8 int main(void){
 9     int n;
10     scanf("%d",&n);
11     for(int t=0;t<n;t++){
12         int k;
13         scanf("%d",&k);
14         if(k==1||k==2){
15             printf("1
");
16             continue;
17         }
18         else{
19             memset(a,0,sizeof(a));
20             memset(b,0,sizeof(b));
21             memset(c,0,sizeof(c));
22             b[0]=b[1]=c[0]=c[1]=1;
23             int tim=1;
24             for(int s=3;s<=k;s++){
25                 if(tim==1)
26                     addfun(b,c,a);
27                 else if(tim==2)
28                     addfun(a,b,c);
29                 else
30                     addfun(c,a,b);
31                 tim++;
32                 if(tim == 4)
33                     tim=1;
34             }
35             if(tim==2){
36                 for(int ll=a[0];ll>0;ll--)
37                     printf("%d",a[ll]);
38                 printf("
");
39             }
40             else if(tim==3){
41                 for(int ll=c[0];ll>0;ll--)
42                     printf("%d",c[ll]);
43                 printf("
");
44             }
45             else{
46                 for(int ll=b[0];ll>0;ll--)
47                     printf("%d",b[ll]);
48                 printf("
");
49             }
50         }
51     }
52 }
53 void addfun(int x[],int y[],int z[]){
54     memset(z,0,sizeof(z));
55     z[0]=x[0]>=y[0]?x[0]:y[0];
56     for(int i=1;i<=z[0];i++){
57         y[i+1]+=(x[i]+y[i])/10;
58         z[i]=(x[i]+y[i])%10;
59     }
60     if(y[z[0]+1] != 0){
61         z[0]++;
62         z[z[0]]=y[z[0]];
63     }
64 }

计算时进位应参加下一位的运算,在原数列中保存结果时直接加到下一位,而在新数列中保存结果时易忽略这一点,所以应该把进位加进下一位加数之中。

HDU1715需要保留一个加数,所以把进位加进准备要牺牲的那个数列中(即f(n-2))。

二、高精度乘法(高精度与高精度)

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<cstring>
 4 int a[1005];
 5 int b[1005];
 6 int c[2010];
 7 using namespace std;
 8 int main(void){
 9     string s1;
10     string s2;
11     while(cin>>s1){
12         cin>>s2;
13         if(s1[0]=='0' || s2[0]=='0'){
14             cout<<0<<endl;
15             continue;
16         }
17         memset(a,0,sizeof(a));
18         memset(b,0,sizeof(b));
19         memset(c,0,sizeof(c));
20         int la=s1.length();
21         int lb=s2.length();
22         for(int i=0;i<la;i++)
23             a[i]=s1[la-i-1]-'0';
24         for(int i=0;i<lb;i++)
25             b[i]=s2[lb-i-1]-'0';
26         int lc=la+lb;
27         for(int i=0;i<la;i++){
28             for(int j=0;j<lb;j++){
29                 c[i+j]+=a[i]*b[j];
30                 c[i+j+1]+=c[i+j]/10;
31                 c[i+j]=c[i+j]%10;
32             }
33         }
34         
35         if(c[lc-1]==0)
36             lc--;
37         for(int ll=lc-1;ll>=0;ll--)
38             cout<<c[ll];
39          
40         cout<<endl;
41     }
42 }
原文地址:https://www.cnblogs.com/liuzey/p/8810566.html