SGU 112 a^b-b^a(高精度)
2016-04-14 11:35
316 查看
Description
给出两正整数a和b,输出a^b-b^a
Input
两个正整数a和b(1<=a,b<=100)
Output
Sample Input
2 3
Sample Output
-1
Solution
高精度
Code
给出两正整数a和b,输出a^b-b^a
Input
两个正整数a和b(1<=a,b<=100)
Output
Sample Input
2 3
Sample Output
-1
Solution
高精度
Code
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define maxn 1111 struct BigInt { const static int mod=10000; const static int LEN=4; int a[maxn],len; BigInt() { memset(a,0,sizeof(a)); len=1; } void init(int x) { memset(a,0,sizeof(a)); len=0; do { a[len++]=x%mod; x/=mod; }while(x); } void Init(const char s[]) { memset(a,0,sizeof(a)); int l=strlen(s),res=0; len=l/LEN; if(l%LEN)len++; for(int i=l-1;i>=0;i-=LEN) { int t=0,k=max(i-LEN+1,0); for(int j=k;j<=i;j++)t=t*10+s[j]-'0'; a[res++]=t; } } int Compare(const BigInt &b) { if(len<b.len)return -1; if(len>b.len)return 1; for(int i=len-1;i>=0;i--) if(a[i]<b.a[i])return -1; else if(a[i]>b.a[i])return 1; return 0; } BigInt operator +(const BigInt &b)const { BigInt ans; ans.len=max(len,b.len); for(int i=0;i<=ans.len;i++)ans.a[i]=0; for(int i=0;i<ans.len;i++) { ans.a[i]+=((i<len)?a[i]:0)+((i<b.len)?b.a[i]:0); ans.a[i+1]+=ans.a[i]/mod; ans.a[i]%=mod; } if(ans.a[ans.len]>0)ans.len++; return ans; } BigInt operator -(const BigInt &b)const { BigInt ans; ans.len=len; int k=0; for(int i=0;i<ans.len;i++) { ans.a[i]=a[i]+k-b.a[i]; if(ans.a[i]<0)ans.a[i]+=mod,k=-1; else k=0; } while(ans.a[ans.len-1]==0&&ans.len>1)ans.len--; return ans; } BigInt operator *(const BigInt &b)const { BigInt ans; for(int i=0;i<len;i++) { int k=0; for(int j=0;j<b.len;j++) { int temp=a[i]*b.a[j]+ans.a[i+j]+k; ans.a[i+j]=temp%mod; k=temp/mod; } if(k!=0)ans.a[i+b.len]=k; } ans.len=len+b.len; while(ans.a[ans.len-1]==0&&ans.len>1)ans.len--; return ans; } BigInt operator *(const int n)const { BigInt b; b.init(n); BigInt ans; for(int i=0;i<len;i++) { int k=0; for(int j=0;j<b.len;j++) { int temp=a[i]*b.a[j]+ans.a[i+j]+k; ans.a[i+j]=temp%mod; k=temp/mod; } if(k!=0)ans.a[i+b.len]=k; } ans.len=len+b.len; while(ans.a[ans.len-1]==0&&ans.len>1)ans.len--; return ans; } BigInt operator /(const int &n)const { BigInt ans; ans.len=len; int k=0; for(int i=ans.len-1;i>=0;i--) { k=k*mod+a[i]; ans.a[i]=k/n; k=k%n; } while(ans.a[ans.len-1]==0&&ans.len>1)ans.len--; return ans; } void output() { printf("%d",a[len-1]); for(int i=len-2;i>=0;i--) printf("%04d",a[i]); printf("\n"); } }; int main() { int a,b; BigInt x,y; while(~scanf("%d%d",&a,&b)) { x.init(a),y.init(b); for(int i=1;i<b;i++)x=x*a; for(int i=1;i<a;i++)y=y*b; if(x.Compare(y)>=0) { x=x-y; x.output(); } else { y=y-x; printf("-"); y.output(); } } return 0; }
相关文章推荐
- cmd的sql执行计划各项属性说明
- java开发环境的安装与配置
- passwd(1) - Linux下 man page
- html5-svg标签使用基础三
- iOS - GCD 之线程死锁
- Maven-生成可执行的Jar包
- java基础--java静态代码块和静态方法的区别、static用法
- JDK自带工具
- uva 的 3 道水题
- js表单注册验证
- C语言段错误调试
- Atitit.atiJsBridge 新特性v7q329
- 今天属于李志-梵高先生
- SGU 111 Very simple problem(高精度+二分)
- html5-svg标签使用基础一
- html5-svg标签使用基础二
- 设计模式 单例模式
- Atitit.atiJsBridge 新特性v7q329
- Atitit.atiJsBridge 新特性v7q329
- 计算距已知坐标一定距离内的经纬度取值范围