大數模板

//大數相加
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10];
int an2[MAXN+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
    memset(an1,0,sizeof(an1));
    int i,j;
    scanf("%s",str1);
    j=0;
    int len1=strlen(str1);
    for(i=len1-1;i>=0;i--)
        an1[j++]=str1[i]-'0';
    while(~scanf("%s",str2)&&str2[0]!='0')
    {
        memset(an2,0,sizeof(an2));
        j=0;
        int len2=strlen(str2);
        for(i=len2-1;i>=0;i--)
            an2[j++]=str2[i]-'0';
          //下面是主要運算過程
        for(i=0;i<MAXN;i++){
            an1[i]+=an2[i];
            if(an1[i]>=10){
                an1[i]-=10;
                an1[i+1]++;
            }
        }
         //輸出
        int pan_0 = 0;
        for(i=MAXN;i>=0;i--){
            if(pan_0)
                printf("%d",an1[i]);
            else if(an1[i]){
                printf("%d",an1[i]);
                pan_0 = 1;
            }
        }
        printf("\n");
    }
    return 0;
}
//大數相減
//改動主要運算過程
for(i=0;i<MAXN;i++){
    an1[i]-=an2[i];
    if(an1[i]<0){
        an1[i]+=10;
        an1[i+1]--;
    }
}

//大數相乘
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN*2+10];
int an2[MAXN+10];
int aresult[MAXN*2+10];
char str1[MAXN+10];
char str2[MAXN+10];
int main()
{
    memset(an1,0,sizeof(an1));
    int i,j;
    scanf("%s",str1);
    j=0;
    int len1=strlen(str1);
    for(i=len1-1;i>=0;i--)
        an1[j++]=str1[i]-'0';
    int duandian;
        duandian=len1-1;
    while(~scanf("%s",str2)&&str2[0]!='0')
    {
        memset(aresult,0,sizeof(aresult));
        memset(an2,0,sizeof(an2));
        j=0;
        int len2=strlen(str2);
        for(i=len2-1;i>=0;i--)
            an2[j++]=str2[i]-'0';
          //下面是主要運算過程
        for(i=0;i<duandian+1;i++)
            for(j=0;j<len2;j++)
            aresult[i+j]+=an1[i]*an2[j];
        for(i=0;i<MAXN;i++){
            if(aresult[i]>=10){
                aresult[i+1]+=aresult[i]/10;
                aresult[i]%=10;
            }
        }
         //輸出
        memset(an1,0,sizeof(an1));
        int pan_0 = 0;
        for(i=MAXN*2;i>=0;i--){
            if(pan_0){
                printf("%d",aresult[i]);
                an1[i]=aresult[i];
            }
            else if(aresult[i]){
                printf("%d",aresult[i]);
                duandian=i;
                an1[i]=aresult[i];
                pan_0 = 1;
            }
        }
        printf("\n");
        memset(str2,0,sizeof(str2));
    }
    return 0;
}

//大數相除,兩個數
//反覆做減法,能減幾個,商就是幾。
#include <stdio.h>
#include <string.h>
#define MAXN 100
int an1[MAXN+10];           //被除數
int an2[MAXN+10];           //除數
int aresult[MAXN+10];       //商
char str1[MAXN+10];
char str2[MAXN+10];
//substract函數表示an1減去an2,返回結果的長度;不夠返回-1;剛好返回0;
int subtract(int *p1,int *p2,int len1,int len2)
{
    int i;
    //判斷p1是否比p2大,不是返回-1
    if(len1<len2)
        return -1;
    int pan = 0;
    if(len1==len2){
        for(i=len1-1;i>=0;i--){
            if(p1[i]>p2[i])
                pan = 1;
            else if(p1[i]<p2[i]){
                if(!pan)
                    return -1;
            }
        }
    }
    //p1不小於p2,做減法
    for(i=0;i<len1;i++){
        p1[i]-=p2[i];
        if(p1[i]<0){
            p1[i]+=10;
            p1[i+1]--;
        }
    }
    for(i=len1-1;i>=0;i--)
        if(p1[i])
            return i+1;
    //一樣大
    return 0;
}
int main()
{
    int t;
    scanf("%s",str1);
    scanf("%s",str2);
    int i,j;
    memset(an1,0,sizeof(an1));
    memset(an2,0,sizeof(an2));
    memset(aresult,0,sizeof(aresult));
    j=0;
    int len1=strlen(str1);
    for(i=len1-1;i>=0;i--)
        an1[j++]=str1[i]-'0';
    j=0;
    int len2=strlen(str2);
    for(i=len2-1;i>=0;i--)
        an2[j++]=str2[i]-'0';
    //運用substract函數
    len1=subtract(an1,an2,len1,len2);
    //情況1
    if(len1<0){
        printf("0\n");
    }
    //情況2
    else if(len1==0){
        printf("1\n");
    }
    //情況3
    else
    {
        aresult[0]++;   //已經減了一次,商加1
        int times=len1-len2;
        if(times<0)     //不能再減
            goto output;
        else if(times>0){
            for(i=len1-1;i>=0;i--){
                if(i>=times)
                    an2[i]=an2[i-times];
                else
                    an2[i]=0;
            }
        }
        //!!!
        len2=len1;
        for(j=0;j<=times;j++){
            int tmp;
            while((tmp=subtract(an1,an2+j,len1,len2-j))>=0){
                len1=tmp;
                aresult[times-j]++;
            }
        }
        output:
            //進位
            for(i=0;i<MAXN;i++){
                if(aresult[i]>=10){
                    aresult[i+1]+=aresult[i]/10;
                    aresult[i]%=10;
                }
            }
            //輸出
            int pan_0 = 0;
            for(i=MAXN;i>=0;i--){
            if(pan_0){
                printf("%d",aresult[i]);
            }
            else if(aresult[i]){
                printf("%d",aresult[i]);
                pan_0 = 1;
            }
        }
        printf("\n");
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章