副标题#e#
描述
请计算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("0\n"); else printf("-%s\n",sub(b,a)); } else printf("%s\n",b)); } else { if(pd(b,a)>=0) printf("%s\n",a)); else { if(strcmp(sub(a,b),"0")) printf("0\n"); else printf("-%s\n",b)); } } } else { //如果符号都为正 if(fa==0) printf("%s\n",add(a,b)); else printf("-%s\n",b)); } } //减法 else if(n==2) { //如果符号不同 if(fa!=fb) { //如果a为正 if(fa==0) printf("%s\n",b)); } else { //如果都为正 if(fa==0) { if(pd(a,b)<0) printf("-%s\n",a)); else printf("%s\n",a)); else printf("-%s\n",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",b)); } //除法 else if(n==4) { if(pd(a,b)<0) { printf("0\n"); continue; } if(fa==fb) printf("%s\n",div(a,b)); } } return 0; }
java 版:
#p#副标题#e##p#分页标题#e#
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(); } }