• 模板 高精度计算


    【模板】高精度计算

     

    大数相加:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 
     5 void add(char a[],char b[],char back[])
     6 {
     7     int i,j,k,up,x,y,z,l;
     8     char *c;
     9     if(strlen(a) > strlen(b))
    10         l = strlen(a)+2;
    11     else
    12         l = strlen(b)+2;
    13     c = (char*)malloc(l*sizeof(char));
    14     i = strlen(a)-1;
    15     j = strlen(b)-1;
    16     k = 0;
    17     up = 0;
    18     while(j>=0 || i>=0)
    19     {
    20         if(i<0) x = '0';
    21         else
    22             x = a[i];
    23         if(j<0) y = '0';
    24         else
    25             y = b[j];
    26         z = x-'0'+y-'0';
    27         if(up)
    28             z++;
    29         if(z>9)
    30         {
    31             up = 1;
    32             z%=10;
    33         }
    34         else
    35             up = 0;
    36         c[k++] = z+'0';
    37         i--;
    38         j--;
    39     }
    40     if(up)
    41         c[k++] = '1';
    42     i = 0;
    43     c[k] = '';
    44     for(k-=1; k>=0; k--)
    45         back[i++] = c[k];
    46     back[i] = '';
    47 }
    48 
    49 int main()
    50 {
    51     char c[10000],t[10000],sum[1000];
    52     int m;
    53     scanf("%d%*c",&m);
    54     while(m--)
    55     {
    56         scanf("%s%s",c,t);
    57         add(c,t,sum);
    58         printf("%s
    ",sum);
    59         if(m)
    60             printf("
    ");
    61     }
    62     return 0;
    63 }

    大数加小数:

     1 void addt(char a[],int b,char c[])
     2 {
     3     int len=strlen(a);
     4     char s[100];
     5     for(int i=0; i<len; i++)
     6         s[len-i-1]=a[i]-'0';
     7     int add=0;
     8     for(int i=0;; i++)
     9     {
    10         if(i>=len)
    11         {
    12             s[i]=0;
    13             len++;
    14         }
    15         int k=s[i]+b%10+add;
    16         b/=10;
    17         if(k>=10)
    18         {
    19             s[i]=k%10;
    20             add=k/10;
    21         }
    22         else
    23         {
    24             s[i]=k;
    25             add=0;
    26         }
    27         if(b==0&&add==0)break;
    28     }
    29     for(int i=0; i<len; i++)
    30         c[len-1-i]=s[i]+'0';
    31     c[len]='';
    32 
    33 }
    34 
    35 int main()
    36 {
    37     char c[1000],t[1000],sum[1000];
    38     int m;
    39     while(~scanf("%s%d",c,&m))
    40     {
    41         mult(c,m,t);
    42         printf("%s
    ",t);
    43         addt(c,m,sum);
    44         printf("%s
    ",sum);
    45     }
    46     return 0;
    47 }

    大数相乘:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 void mult(char a[],char b[],char s[])
     5 {
     6    int i,j,k = 0,alen,blen,sum = 0,res[65][65]={0},flag = 0;
     7    char result[65];
     8    alen = strlen(a);
     9    blen = strlen(b);
    10    for(i = 0;i<alen;i++)
    11    {
    12        for(j = 0;j<blen;j++)
    13        res[i][j] = (a[i]-'0')*(b[j]-'0');
    14    }
    15    for(i = alen-1;i>=0;i--)
    16    {
    17        for(j = blen-1;j>=0;j--)
    18        {
    19            sum = sum+res[i+blen-j-1][j];
    20            printf("res = %d
    ",res[i+blen-j-1][j]);
    21        }
    22        result[k] = sum%10;
    23        k++;
    24        sum = sum/10;
    25    }
    26    for(i = blen-2;i>=0;i--)
    27    {
    28        for(j = 0;j<=i;j++)
    29        {
    30            sum = sum+res[i-j][j];
    31        }
    32        result[k] = sum%10;
    33        k++;
    34        sum = sum/10;
    35    }
    36    if(sum)
    37    {
    38        result[k] = sum;
    39        k++;
    40    }
    41    for(i = 0;i<k;i++)
    42    result[i]+='0';
    43    for(i = k-1;i>=0;i--)
    44    s[i] = result[k-1-i];
    45    s[k] = '';
    46    while(1)
    47    {
    48        if(strlen(s)!=strlen(a) && s[0] == '0')
    49        strcpy(s,s+1);
    50        else
    51        break;
    52    }
    53 }
    54 
    55 int main()
    56 {
    57     char c[1000],t[1000],sum[1000];
    58     int m;
    59     while(~scanf("%s%s",c,t))
    60     {
    61         mult(c,t,sum);
    62         printf("%s
    ",sum);
    63     }
    64     return 0;
    65 }

    大数乘小数:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 void mult(char c[],int m,char t[])
     5 {
     6     char s[100];
     7     int len=strlen(c);
     8     for(int i=0; i<len; i++)
     9         s[len-i-1]=c[i]-'0';
    10     int flag,add=0;
    11     for(int i=0; i<len; i++)
    12     {
    13         int k=s[i]*m+add;
    14         if(k>=10)
    15         {
    16             s[i]=k%10;
    17             add=k/10;
    18             flag=1;
    19         }
    20         else
    21         {
    22             s[i]=k;
    23             add=0;
    24             flag=0;
    25         }
    26     }
    27     while(add)
    28     {
    29         s[len++]=add%10;
    30         add/=10;
    31     }
    32     for(int i=0; i<len; i++)
    33         t[len-1-i]=s[i]+'0';
    34     t[len]='';
    35 }

    大数相乘:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 void sub(char s1[],char s2[],char t[])
     5 {
     6     int i,l1,l2,k;
     7     l2 = strlen(s2);
     8     l1 = strlen(s1);
     9     t[l1] = '';
    10     l1--;
    11     for(i = l2-1; i>=0; i--,l1--)
    12     {
    13         if(s1[l1]-s2[i]>=0)
    14             t[l1] = s1[l1] - s2[i] + '0';
    15         else
    16         {
    17             t[l1] = 10+s1[l1] - s2[i]+'0';
    18             s1[l1-1]= s1[l1-1] -1;
    19         }
    20     }
    21     k = l1;
    22     while(s1[k]<0)
    23     {
    24         s1[k]+=10;
    25         s1[k-1]-=1;
    26         k--;
    27     }
    28     while(l1>=0)
    29     {
    30         t[l1] = s1[l1];
    31         l1--;
    32     }
    33 loop:
    34     if(t[0] == '0')
    35     {
    36         l1 = strlen(s1);
    37         for(i = 0; i<l1-1; i++)
    38             t[i] = t[i+1];
    39         t[l1-1] = '';
    40         goto loop;
    41     }
    42     if(strlen(t) == 0)
    43     {
    44         t[0] = '0';
    45         t[1] = '';
    46     }
    47 }
    48 
    49 int main()
    50 {
    51     char c[1000],t[1000],sum[1000];
    52     int m;
    53     while(~scanf("%s%s",c,t))
    54     {
    55         sub(c,t,sum);
    56         printf("%s
    ",sum);
    57     }
    58     return 0;
    59 }

    大数阶乘:

     1 #include<iostream>
     2 #include<cmath>
     3 using namespace std;
     4 int main()
     5 {
     6     void factorial(int n,int *) ;
     7     int b[10000];
     8     int n;
     9     while(cin>>n)
    10     {
    11         factorial(n,b);
    12     }
    13     return 0;
    14 }
    15 void factorial(int n,int b[10000])
    16 {
    17     long a[10000];
    18     int i,j,l,c,m=0,w;
    19     a[0]=1;
    20     for(i=1; i<=n; i++)
    21     {
    22         c=0;
    23         for(j=0; j<=m; j++)
    24         {
    25             a[j]=a[j]*i+c;
    26             c=a[j]/10000;
    27             a[j]=a[j]%10000;
    28         }
    29         if(c>0)
    30         {
    31             m++;
    32             a[m]=c;
    33         }
    34     }
    35     w = m*4+log10(a[m])+1;
    36     cout << w << endl;
    37     cout<<a[m];
    38     for(i=m-1; i>=0; i--)
    39         cout<<a[i];
    40     cout<<endl;
    41 }

    大数进制转换:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 void consversion(char s[],char s2[],long d1,long d2)
     5 {
     6     long i,j,t,num;
     7     char c;
     8     num = 0;
     9     for(i = 0;s[i]!='';i++)
    10     {
    11         if(s[i]<='9' && s[i]>='0')
    12         t = s[i] - '0';
    13         else
    14         t = s[i] - 'A' +10;
    15         num = num*d1+t;
    16     }
    17     i = 0;
    18     while(1)
    19     {
    20         t = num%d2;
    21         if(t<=9)
    22         s2[i] = t+'0';
    23         else
    24         s2[i] = t+'A'-10;
    25         num/=d2;
    26         if(num == 0)
    27         break;
    28         i++;
    29     }
    30     for(j = 0;j<i/2;j++)
    31     {
    32         c = s2[j];
    33         s2[j] = s[i-j];
    34         s2[i-j] = c;
    35     }
    36     s2[i+1]='';
    37 }
    38 
    39 int main()
    40 {
    41     char s1[1000],s2[1000];
    42     int d1,d2;
    43     while(~scanf("%s%d%d",s1,&d1,&d2))
    44     {
    45         consversion(s1,s2,d1,d2);
    46 //将d1进制的s1转换成d2进制s2.
    47         printf("%s
    ",s2);
    48     }
    49 
    50     return 0;
    51 }
  • 相关阅读:
    最短路径之spfa
    最短路径之Bellman-Ford——解决负权边
    最短路径之Floyd-Warshall算法
    图上最短路径问题
    它们其实都是图(二分图)
    记忆化结果再利用 进一步探讨递推关系
    leetcode 376. 摆动序列 java
    leetcode 368. 最大整除子集 java
    leetcode 96. 不同的二叉搜索树 java
    leetcode 454. 四数相加 II java
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4473388.html
Copyright © 2020-2023  润新知