设为首页 - 加入收藏 PHP编程网 - PHP站长网 (http://www.52php.cn)- 电商,百科,编程,业界,移动互联,5G,云计算,站长网!
热搜: 娱乐 服务 百度 专业
当前位置: 首页 > 大数据 > 正文

大数运算模板(C语言)

发布时间:2021-01-24 03:43 所属栏目:[大数据] 来源:网络整理
导读:代码说明: //大数相加#include stdio.h#include string.h#define MAXN 100int 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); f

代码说明:

//大数相加
#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,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,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,sizeof(aresult));
        memset(an2,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,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,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,sizeof(an1));
    memset(an2,sizeof(an2));
    memset(aresult,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,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;
}

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

推荐文章
热点阅读