高精度计算大数模板

大数加法

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
void add(char a[],char b[],char back[])
{
    int i,j,k,up,x,y,z,l;
    char *c;
    if(strlen(a) > strlen(b))
        l = strlen(a)+2;
    else
        l = strlen(b)+2;
    c = (char*)malloc(l*sizeof(char));
    i = strlen(a)-1;
    j = strlen(b)-1;
    k = 0;
    up = 0;
    while(j>=0 || i>=0)
    {
        if(i<0) x = '0';
        else
            x = a[i];
        if(j<0) y = '0';
        else
            y = b[j];
        z = x-'0'+y-'0';
        if(up)
            z++;
        if(z>9)
        {
            up = 1;
            z%=10;
        }
        else
            up = 0;
        c[k++] = z+'0';
        i--;
        j--;
    }
    if(up)
        c[k++] = '1';
    i = 0;
    c[k] = '\0';
    for(k-=1; k>=0; k--)
        back[i++] = c[k];
    back[i] = '\0';
}
 
int main()
{
    char c[10000],t[10000],sum[1000];
    int m;
    scanf("%d%*c",&m);
    while(m--)
    {
        scanf("%s%s",c,t);
        add(c,t,sum);
        printf("%s\n",sum);
        if(m)
            printf("\n");
    }
    return 0;
}

大数相乘

#include <stdio.h>
#include <string.h>
 
void mult(char a[],char b[],char s[])
{
   int i,j,k = 0,alen,blen,sum = 0,res[65][65]={0},flag = 0;
   char result[65];
   alen = strlen(a);
   blen = strlen(b);
   for(i = 0;i<alen;i++)
   {
       for(j = 0;j<blen;j++)
       res[i][j] = (a[i]-'0')*(b[j]-'0');
   }
   for(i = alen-1;i>=0;i--)
   {
       for(j = blen-1;j>=0;j--)
       {
           sum = sum+res[i+blen-j-1][j];
           printf("res = %d\n",res[i+blen-j-1][j]);
       }
       result[k] = sum%10;
       k++;
       sum = sum/10;
   }
   for(i = blen-2;i>=0;i--)
   {
       for(j = 0;j<=i;j++)
       {
           sum = sum+res[i-j][j];
       }
       result[k] = sum%10;
       k++;
       sum = sum/10;
   }
   if(sum)
   {
       result[k] = sum;
       k++;
   }
   for(i = 0;i<k;i++)
   result[i]+='0';
   for(i = k-1;i>=0;i--)
   s[i] = result[k-1-i];
   s[k] = '\0';
   while(1)
   {
       if(strlen(s)!=strlen(a) && s[0] == '0')
       strcpy(s,s+1);
       else
       break;
   }
}
 
int main()
{
    char c[1000],t[1000],sum[1000];
    int m;
    while(~scanf("%s%s",c,t))
    {
        mult(c,t,sum);
        printf("%s\n",sum);
    }
    return 0;
}

大数乘以小数

#include <stdio.h>
#include <string.h>
 
void mult(char c[],int m,char t[])
{
    char s[100];
    int len=strlen(c);
    for(int i=0; i<len; i++)
        s[len-i-1]=c[i]-'0';
    int flag,add=0;
    for(int i=0; i<len; i++)
    {
        int k=s[i]*m+add;
        if(k>=10)
        {
            s[i]=k%10;
            add=k/10;
            flag=1;
        }
        else
        {
            s[i]=k;
            add=0;
            flag=0;
        }
    }
    while(add)
    {
        s[len++]=add%10;
        add/=10;
    }
    for(int i=0; i<len; i++)
        t[len-1-i]=s[i]+'0';
    t[len]='\0';
}
//大数加小数
void addt(char a[],int b,char c[])
{
    int len=strlen(a);
    char s[100];
    for(int i=0; i<len; i++)
        s[len-i-1]=a[i]-'0';
    int add=0;
    for(int i=0;; i++)
    {
        if(i>=len)
        {
            s[i]=0;
            len++;
        }
        int k=s[i]+b%10+add;
        b/=10;
        if(k>=10)
        {
            s[i]=k%10;
            add=k/10;
        }
        else
        {
            s[i]=k;
            add=0;
        }
        if(b==0&&add==0)break;
    }
    for(int i=0; i<len; i++)
        c[len-1-i]=s[i]+'0';
    c[len]='\0';
 
}
 
int main()
{
    char c[1000],t[1000],sum[1000];
    int m;
    while(~scanf("%s%d",c,&m))
    {
        mult(c,m,t);
        printf("%s\n",t);
        addt(c,m,sum);
        printf("%s\n",sum);
    }
    return 0;
}

大数减法

#include <stdio.h>
#include <string.h>
 
void sub(char s1[],char s2[],char t[])
{
    int i,l1,l2,k;
    l2 = strlen(s2);
    l1 = strlen(s1);
    t[l1] = '\0';
    l1--;
    for(i = l2-1; i>=0; i--,l1--)
    {
        if(s1[l1]-s2[i]>=0)
            t[l1] = s1[l1] - s2[i] + '0';
        else
        {
            t[l1] = 10+s1[l1] - s2[i]+'0';
            s1[l1-1]= s1[l1-1] -1;
        }
    }
    k = l1;
    while(s1[k]<0)
    {
        s1[k]+=10;
        s1[k-1]-=1;
        k--;
    }
    while(l1>=0)
    {
        t[l1] = s1[l1];
        l1--;
    }
loop:
    if(t[0] == '0')
    {
        l1 = strlen(s1);
        for(i = 0; i<l1-1; i++)
            t[i] = t[i+1];
        t[l1-1] = '\0';
        goto loop;
    }
    if(strlen(t) == 0)
    {
        t[0] = '0';
        t[1] = '\0';
    }
}
 
int main()
{
    char c[1000],t[1000],sum[1000];
    int m;
    while(~scanf("%s%s",c,t))
    {
        sub(c,t,sum);
        printf("%s\n",sum);
    }
    return 0;
}

 

大数阶乘

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    void factorial(int n,int *) ;
    int b[10000];
    int n;
    while(cin>>n)
    {
        factorial(n,b);
    }
    return 0;
}
void factorial(int n,int b[10000])
{
    long a[10000];
    int i,j,l,c,m=0,w;
    a[0]=1;
    for(i=1; i<=n; i++)
    {
        c=0;
        for(j=0; j<=m; j++)
        {
            a[j]=a[j]*i+c;
            c=a[j]/10000;
            a[j]=a[j]%10000;
        }
        if(c>0)
        {
            m++;
            a[m]=c;
        }
    }
    w = m*4+log10(a[m])+1;
    cout << w << endl;
    cout<<a[m];
    for(i=m-1; i>=0; i--)
        cout<<a[i];
    cout<<endl;
}

 

进制转换

#include <stdio.h>
#include <string.h>
 
void consversion(char s[],char s2[],long d1,long d2)
{
    long i,j,t,num;
    char c;
    num = 0;
    for(i = 0;s[i]!='\0';i++)
    {
        if(s[i]<='9' && s[i]>='0')
        t = s[i] - '0';
        else
        t = s[i] - 'A' +10;
        num = num*d1+t;
    }
    i = 0;
    while(1)
    {
        t = num%d2;
        if(t<=9)
        s2[i] = t+'0';
        else
        s2[i] = t+'A'-10;
        num/=d2;
        if(num == 0)
        break;
        i++;
    }
    for(j = 0;j<i/2;j++)
    {
        c = s2[j];
        s2[j] = s[i-j];
        s2[i-j] = c;
    }
    s2[i+1]='\0';
}
 
int main()
{
    char s1[1000],s2[1000];
    int d1,d2;
    while(~scanf("%s%d%d",s1,&d1,&d2))
    {
        consversion(s1,s2,d1,d2);
        printf("%s\n",s2);
    }
 
    return 0;
}

 

posted @ 2018-11-01 13:25  浮生惘语  阅读(113)  评论(0编辑  收藏  举报