1. 程式人生 > 實用技巧 >高精度演算法模板

高精度演算法模板

高精度加1

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     char a[310], b[310];
 6     int c[310], d[310], e[310];
 7     scanf("%s %s", a, b);
 8     int x = strlen(a), y = strlen(b);
 9     for (int i = 0; i < x; i++) {
10         c[x-1-i] = a[i] - '0';
11     }
12     for
(int i = 0; i < y; i++) { 13 d[y-1-i] = b[i] - '0'; 14 } 15 int l = (x > y) ? x : y; 16 memset(e, 0, sizeof(e)); 17 for (int i = 0; i < l; i++) { 18 e[i] += c[i] + d[i]; 19 if(e[i] > 9) e[i] -= 10,e[i+1] = 1; 20 } 21 if(e[l]) l++; 22 for(int
i = l-1; i >= 0; i--) printf("%d", e[i]); 23 printf("\n"); 24 return 0; 25 }

高精度減法

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4  
 5 const int maxn = 300 + 5;
 6  
 7 int main(int argc, char **argv) {
 8     int a[maxn], b[maxn], c[maxn];
 9     char s1[maxn], s2[maxn];
10 char *ss1 = s1, *ss2 = s2; 11 memset(a, 0, sizeof(a) ); 12 memset(b, 0, sizeof(b) ); 13 memset(c, 0, sizeof(c) ); 14 15 scanf("%s%s", s1, s2); 16 if( strlen(s1)<strlen(s2) || (strlen(s1)==strlen(s2)&&strcmp(s1,s2)<0) ){ 17 ss1 = s2; 18 ss2 = s1; 19 printf("-"); 20 }else if( !strcmp(s1,s2) ){ 21 printf("0"); 22 return 0; 23 } 24 int len1 = strlen(ss1); 25 int len2 = strlen(ss2); 26 for( int i=0; i<len1; i++ ) 27 a[len1-1-i] = ss1[i]-'0'; 28 for( int i=0; i<len2; i++ ) 29 b[len2-1-i] = ss2[i]-'0'; 30 int j; 31 for( j=0; j<len1||j<len2; j++ ){ 32 c[j] += a[j]-b[j]; 33 if( c[j]<0 ){ 34 c[j] += 10; 35 c[j+1] --; 36 } 37 } 38 int lenc = j; 39 for( ; lenc>=0 && !c[lenc]; lenc-- ); 40 for( ; lenc>=0; lenc-- ) 41 printf("%d", c[lenc]); 42 /*scanf("%s%s", s1, s2); 43 printf("%d", strcmp(ss1, ss2));*/ 44 45 return 0; 46 }

高精度乘法

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4  
 5 char a1[55],b1[55];
 6 int a[55],b[55],c[125];
 7  
 8 int main(){
 9     scanf("%s%s",a1,b1);
10     int lena=strlen(a1);
11     int lenb=strlen(b1);
12     for(int i=1;i<=lena;i++)
13         a[i]=a1[lena-i]-'0';
14     for(int i=1;i<=lenb;i++)
15         b[i]=b1[lenb-i]-'0';
16     for(int i=1;i<=lena;i++){
17         int x=0;
18         for(int j=1;j<=lenb;j++){
19             c[i+j-1]+=a[i]*b[j]+x;
20             x=c[i+j-1]/10;
21             c[i+j-1]%=10;
22         }
23         c[i+lenb]=x;
24     }
25     int lenc=lena+lenb;
26     while(c[lenc]==0&&lenc>1)
27         lenc--;
28     while(lenc)
29         printf("%d",c[lenc--]);
30     return 0;
31 }

高精乘除單精法

 1 #include<stdlib.h>
 2 #include<stdio.h>
 3 char s[501],ch;
 4 int a[501],b,ka,k=0;
 5 void f()
 6 {
 7      int i,c=0;
 8      for(i=0;i<k;i++)
 9      {
10          a[i]=a[i]*b+c;
11          if(a[i]>=10)
12          {
13             c=a[i];
14             a[i]=a[i]%10;
15             c=c/10;
16          }else c=0;
17      }
18      if(c!=0) printf("%d",c);
19      for(i=k-1;i>=0;i--)
20      printf("%d",a[i]);
21 }
22 void x()
23 {
24      int d=0,i,c;
25      for(i=k-1;i>=0;i--)
26      {
27          c=a[i]+d*10;
28          a[i]=(a[i]+d*10)/b;
29          d=c%b;
30      }
31      while((a[k-1]==0)&&(k>0)) k--;
32      for(i=k-1;i>=0;i--)
33       printf("%d",a[i]);
34      if(d!=0)
35       printf("---%d",d);
36 }
37 int main()
38 {
39     int i,temp;
40     scanf("%s",s);
41     while((s[k]!='*')&&(s[k]!='/'))
42     {
43         a[k]=s[k]-'0';
44         k++;
45     }
46     ch=s[k];
47     b=s[strlen(s)-1]-'0';
48     ka=k;//讀入
49     for(i=0;i<(ka>>1);i++)
50     {
51         temp=a[i];
52         a[i]=a[ka-1-i];
53         a[ka-1-i]=temp;
54     }
55     if(ch=='*') f(); else x();
56     system("pause");
57     return 0;
58 }