描述
请计算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;
}
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