加入收藏 | 设为首页 | 会员中心 | 我要投稿 湘西站长网 (https://www.0743zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 c/c

发布时间:2021-03-17 13:35:52 所属栏目:大数据 来源:网络整理
导读:描述 请计算a与b加减乘除的结果。a与b的值不超过100位,且为整数。 输入 第一行,用例数T。 第二行,整数n,(1,2,3,4)分别表示加减乘除。 第三行,整数a与b。 输出 输出a与b计算后的值。(除法只需保留整数位)。 样例输入 4 1 1 2 2 10 8 3 4 5 4 8 5 样例
副标题[/!--empirenews.page--]

描述
请计算a与b加减乘除的结果。a与b的值不超过100位,且为整数。
输入
第一行,用例数T。
第二行,整数n,(1,2,3,4)分别表示加减乘除。
第三行,整数a与b。
输出
输出a与b计算后的值。(除法只需保留整数位)。
样例输入
4
1
1 2
2
10 8
3
4 5
4
8 5
样例输出
3
2
20
1


分析:模拟题,这里分java与c两种写法。

c/c++版:

#include<iostream>
#include<stdio.h>
#include<string.h>
#define Len 1000//大数的长度
using namespace std;
int fa,fb;//a,b的符号,1为负

char *add(char a[],char b[])
{
    int i,j,za[Len]={0},zb[Len]={0};
    int c[Len]={0};
    int k=0,la=strlen(a),lb=strlen(b);
    int len=la>lb?la:lb;
    for(i=la-1;i>=0;i--)
        za[k++]=a[i]-'0';
    k=0;
    for(i=lb-1;i>=0;i--)
        zb[k++]=b[i]-'0';
    for(i=0;i<len;i++)
        c[i]=za[i]+zb[i];
    for(i=0;i<Len;i++)
    {
        if(c[i]>=10)
        {
            c[i]-=10;
            c[i+1]++;
        }
    }
    //将答案返回成字符串
    char ans[Len];
    k=0;
    for(i=Len-1;i>0&&c[i]==0;i--);
    for(j=i;j>=0;j--)
    {
        ans[k++]=c[j]+'0';
    }
    ans[k]=0;
    return ans;
}

char *sub(char a[],lb=strlen(b);
    int len=la>lb?la:lb;
    for(i=la-1;i>=0;i--)
        za[k++]=a[i]-'0';
    k=0;
    for(i=lb-1;i>=0;i--)
        zb[k++]=b[i]-'0';
    //-------就这一部分不同----------
    for(int i=0;i<Len;i++)
    {
        if(za[i]-zb[i]<0)
        {
            za[i]+=10;
            za[i+1]--;
        }
        c[i]=za[i]-zb[i];
    }
    //--------------------------------

    //将答案返回成字符串
    char ans[Len];
    k=0;
    for(i=Len-1;i>0&&c[i]==0;i--);
    for(j=i;j>=0;j--)
    {
        ans[k++]=c[j]+'0';
    }
    ans[k]=0;
    return ans;
}

char *mul(char a[],lb=strlen(b);
    int len=la>lb?la:lb;
    for(i=la-1;i>=0;i--)
        za[k++]=a[i]-'0';
    k=0;
    for(i=lb-1;i>=0;i--)
        zb[k++]=b[i]-'0';

    for(int i=0;i<la;i++)
    {
        for(int j=0;j<lb;j++)
        {
            c[i+j]+=za[i]*zb[j];
            if(c[i+j]>=10)
            {
                c[i+j+1]+=c[i+j]/10;
                c[i+j]%=10;
            }
        }
    }
    //将答案返回成字符串
    char ans[Len];
    k=0;
    for(i=Len-1;i>0&&c[i]==0;i--);
    for(j=i;j>=0;j--)
    {
        ans[k++]=c[j]+'0';
    }
    ans[k]=0;
    return ans;
}
int pd(char a[],char b[])
{
? ? int la=strlen(a),lb=strlen(b);
? ? if(la>lb) return 1;
? ? if(la==lb&&strcmp(a,b)>0) return 1;
? ? if(la==lb&&strcmp(a,b)==0) return 0;
? ? return -1;
}

char *div(char a[],char b[])
{
    //直接减,优化
    char ans[Len]="0";
    //加数,减数
    char jiashu[Len]="1";
    char jianshu[Len];
    strcpy(jianshu,b);
    int k,i,j;

    while(pd(a,jianshu)>0)
    {
        int l=strlen(jianshu);
        jianshu[l]='0';
        jianshu[l+1]=0;
        l=strlen(jiashu);
        jiashu[l]='0';
        jiashu[l+1]=0;
    }


    while(pd(a,b)>=0)
    {
        while(pd(a,jianshu)<0)
        {
            int l=strlen(jianshu);
            jianshu[l-1]=0;
            l=strlen(jiashu);
            jiashu[l-1]=0;
        }
        strcpy(a,sub(a,jianshu));
        strcpy(ans,add(ans,jiashu));


    }
    return ans;
}

int main()
{
    char a[Len],b[Len],c[Len];
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        fa=fb=0;
        scanf("%d",&n);
        scanf("%s %s",a,b);
        if(a[0]=='-')
        {
            fa=1;
            strcpy(a,a+1);
        }
        if(b[0]=='-')
        {
            fb=1;
            strcpy(b,b+1);
        }
        //加法
        if(n==1)
        {
            //如果符号不同
            if(fa!=fb)
            {
                //如果a为正
                if(fa==0)
                {
                    //如果a的绝对值比b大(减法只能处理a>b的情况)
                    if(pd(a,b)>=0)
                    {
                        //处理-0的情况
                        if(strcmp(sub(b,a),"0")==0)
                            printf("0n");
                        else
                            printf("-%sn",sub(b,a));
                    }

                    else
                        printf("%sn",b));
                }
                else
                {
                    if(pd(b,a)>=0)
                        printf("%sn",a));
                    else
                    {
                        if(strcmp(sub(a,b),"0")) printf("0n");
                        else printf("-%sn",b));
                    }

                }
            }
            else
            {
                //如果符号都为正
                if(fa==0)
                    printf("%sn",add(a,b));
                else
                    printf("-%sn",b));
            }
        }
        //减法
        else if(n==2)
        {
            //如果符号不同
            if(fa!=fb)
            {
                //如果a为正
                if(fa==0)
                    printf("%sn",b));
            }
            else
            {
                //如果都为正
                if(fa==0)
                {
                    if(pd(a,b)<0)
                        printf("-%sn",a));
                    else
                        printf("%sn",a));
                    else
                        printf("-%sn",b));
                }
            }
        }
        //乘法
        else if(n==3)
        {
            if(strcmp("0",a)==0||strcmp("0",b)==0)
            {
                printf("0n");
                continue;
            }
            if(fa==fb)
                printf("%sn",mul(a,b));
            else
                printf("-%sn",b));
        }
        //除法
        else if(n==4)
        {
            if(pd(a,b)<0)
            {
                printf("0n");
                continue;
            }
            if(fa==fb)
                printf("%sn",div(a,b));
        }
    }
    return 0;
}


java 版:

(编辑:湘西站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读