整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 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--]
描述 分析:模拟题,这里分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; } (编辑:湘西站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |