C++——NOIP模拟题——减法

来源:互联网 发布:vb宽度高度 编辑:程序博客网 时间:2024/06/05 09:31

减法

题目描述

给出 a 和 b ,输出 ab - ba 。

输入格式

输入一行,两个整数 a 和 b ,空格隔开。其中:1<=a,b<=100 。

输出格式

输出一个整数,表示 ab – ba 的值。

样例数据 1

输入

2 3

输出

-1

解题报告:

对于此题,由于a,b的范围比较小,所以对于a^b计算,可以直接用高精度*单精度进行b次计算,b^a也是同样的方法。
高精度中的一个优化:压位,常用的方法是采用万进制,建议以后写高精度加减乘的时候都使用万进制。
另外,此题可以把数据规模扩大(例如a,b<=10000),这个时候计算 a^b 就要采用快速幂(或二分)。


#include <cstdio>#include <algorithm>using namespace std;const int maxn=2600;struct BigNumber{int n,a[maxn];BigNumber(int x=1){a[n=1]=x;}void operator*=(int x){for(int i=1;i<=n;++i)a[i]*=x;for(int i=1;i<=n;++i)if(a[i]>=10000){a[i+1]+=a[i]/10000;a[i]%=10000;}while(a[n+1]>0){++n;if(a[n]>=10000){a[n+1]+=a[n]/10000;a[n]%=10000;}}}void print(){printf("%d",a[n]);for(int i=n-1;i;--i)printf("%04d",a[i]);puts("");}};BigNumber operator-(BigNumber a,const BigNumber &b){BigNumber c(0);for(int i=1;i<=a.n;++i){c.a[i]=a.a[i]-b.a[i];if(c.a[i]<0)--a.a[i+1],c.a[i]+=10000;}c.n=1;for(int i=a.n;i;--i)if(c.a[i]>0){c.n=i;break;}return c;}bool operator<=(const BigNumber &a,const BigNumber &b){if(a.n>b.n)return 0;if(a.n<b.n)return 1;for(int i=a.n;i;--i)if(a.a[i]<b.a[i])return 1;else if(a.a[i]>b.a[i])return 0;return 1;}int main(){int a,b;scanf("%d%d",&a,&b);static BigNumber M,N;for(int i=1;i<=b;++i)M*=a;for(int i=1;i<=a;++i)N*=b;if(N<=M)(M-N).print();else{printf("-");(N-M).print();}return 0;}

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;char n1[201],n2[201];inline void jianfa(){static int a[201],b[201],c[201],lena,lenb,lenc;char n[201];if(strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0)){strcpy(n,n1);strcpy(n1,n2);strcpy(n2,n);cout<<"-";}lena=strlen(n1);lenb=strlen(n2);for(short i=0;i<lena;++i) a[lena-i]=int(n1[i]-'0');for(short i=0;i<lenb;++i) b[lenb-i]=int(n2[i]-'0');short i=1;while(i<=lena||i<=lenb){if(a[i]<b[i]){a[i]+=10;a[i+1]--;}c[i]=a[i]-b[i];i++;}lenc=i;while((c[lenc]==0)&&(lenc>1)) --lenc;for(i=lenc;i>=1;--i) cout<<c[i];}int main(){static int a[201],b[201];static short aa,bb,lena,lenb;cin>>aa>>bb;if(aa<10) a[1]=aa,lena=1;else if(aa<100) a[1]=aa%10,a[2]=aa/10,lena=2;else a[3]=1,lena=3;if(bb<10) b[1]=bb,lenb=1;else if(bb<100) b[1]=bb%10,b[2]=bb/10,lenb=2;else b[3]=1,lenb=3;for(short i=1;i<bb;++i){for(short j=1;j<=lena;++j) a[j]*=aa;for(short j=1;;++j){if(a[j]>9){a[j+1]+=a[j]/10;a[j]%=10;if(j==lena) ++lena;}else if(j==lena) break;}}for(short i=1;i<aa;++i){for(short j=1;j<=lenb;++j) b[j]*=bb;for(short j=1;;++j){if(b[j]>9){b[j+1]+=b[j]/10;b[j]%=10;if(j==lenb) ++lenb;}else if(j==lenb) break;}}char c[1];int d;for(short i=lena;i>=1;--i){d=a[i];sprintf(c,"%d",d);strncat(n1,c,1);}for(short i=lenb;i>=1;--i){d=b[i];sprintf(c,"%d",d);strncat(n2,c,1);}jianfa();return 0;}


0 0
原创粉丝点击