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

描述
请计算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
#include
#include
#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=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[],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(int i=0;i0&&c[i]==0;i--);
    for(j=i;j>=0;j--)
    {
        ans[k++]=c[j]+'0';
    }
    ans[k]=0;
    return ans;
}

char *mul(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(int i=0;i=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("0\n");
                        else
                            printf("-%s\n",sub(b,a));
                    }

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

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


java 版:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        BigInteger a,b;
        int T,n;
        T=in.nextInt();
        for(int i=0;i



你可能感兴趣的:(java大数,模拟,acm,模拟)