高精度模板

加法

  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] = '\0';  
  44.     for(k-=1; k>=0; k--)  
  45.         back[i++] = c[k];  
  46.     back[i] = '\0';  
  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\n",sum);  
  59.         if(m)  
  60.             printf("\n");  
  61.     }  
  62.     return 0;  
  63. }  


大数相乘

  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\n",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] = '\0';  
  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\n",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]='\0';  
  35. }  
  36. //大数加小数  
  37. void addt(char a[],int b,char c[])  
  38. {  
  39.     int len=strlen(a);  
  40.     char s[100];  
  41.     for(int i=0; i<len; i++)  
  42.         s[len-i-1]=a[i]-'0';  
  43.     int add=0;  
  44.     for(int i=0;; i++)  
  45.     {  
  46.         if(i>=len)  
  47.         {  
  48.             s[i]=0;  
  49.             len++;  
  50.         }  
  51.         int k=s[i]+b%10+add;  
  52.         b/=10;  
  53.         if(k>=10)  
  54.         {  
  55.             s[i]=k%10;  
  56.             add=k/10;  
  57.         }  
  58.         else  
  59.         {  
  60.             s[i]=k;  
  61.             add=0;  
  62.         }  
  63.         if(b==0&&add==0)break;  
  64.     }  
  65.     for(int i=0; i<len; i++)  
  66.         c[len-1-i]=s[i]+'0';  
  67.     c[len]='\0';  
  68.   
  69. }  
  70.   
  71. int main()  
  72. {  
  73.     char c[1000],t[1000],sum[1000];  
  74.     int m;  
  75.     while(~scanf("%s%d",c,&m))  
  76.     {  
  77.         mult(c,m,t);  
  78.         printf("%s\n",t);  
  79.         addt(c,m,sum);  
  80.         printf("%s\n",sum);  
  81.     }  
  82.     return 0;  
  83. }  


 

大数减法

  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] = '\0';  
  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] = '\0';  
  40.         goto loop;  
  41.     }  
  42.     if(strlen(t) == 0)  
  43.     {  
  44.         t[0] = '0';  
  45.         t[1] = '\0';  
  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\n",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]!='\0';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]='\0';  
  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.         printf("%s\n",s2);  
  47.     }  
  48.   
  49.     return 0;  
  50. }  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值