您的位置:首页 > 编程语言 > C语言/C++

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

2016-05-04 15:09 756 查看
描述

请计算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[],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<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[],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<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("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<T;i++){
n=in.nextInt();
a=in.nextBigInteger();
b=in.nextBigInteger();
if(n==1) System.out.println(a.add(b));
if(n==2) System.out.println(a.add(b.negate()));
if(n==3) System.out.println(a.multiply(b));
if(n==4) System.out.println(a.divide(b));
}
in.close();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: