高精度gcd
例题
更相减损&不压位
Code
#include<iostream> using namespace std; string str1,str2; const int maxn=10001; int a[maxn],b[maxn],c[maxn]; bool cmp1() { for(int i=maxn-1;i>=0;i--) { if(a[i]>b[i]) return true; if(a[i]<b[i]) return false; } return true; } bool judge() { for(int i=0;i<maxn;i++) if(a[i]) return false; return true; } void swap_array() { for(int i=0;i<maxn;i++) swap(a[i],b[i]); } void gcd() { if(!cmp1()) swap_array(); for(int i=0;i<maxn;i++) { a[i]-=b[i]; if(a[i]<0) { a[i+1]-=1; a[i]+=10; } } if(!judge()) gcd(); return; } int main() { cin>>str1>>str2; for(int i=0;i<str1.size();i++) a[str1.size()-i-1]=str1[i]-'0'; for(int i=0;i<str2.size();i++) b[str2.size()-i-1]=str2[i]-'0'; gcd(); bool s=0; for(int i=maxn-1;i>=0;i--) { if(b[i]) s=1; if(s==1) cout<<b[i]; } return 0; }
Attention
很容易TLE
P2152只有46分
optimize
由于两个数的位数是会越来越少的,所以将变量e保存当前a数组的位数,每次计算前先看看变量e可不可以更新。
然后再for循环的起点或边界条件设置为e(用e代替maxn)即可
Code
#include<iostream> using namespace std; string str1,str2; const int maxn=10001; int e=maxn; int a[maxn],b[maxn],c[maxn]; void update() { for(int i=e+1;i>=0;i--) if(a[i]) {e=i+1;return;} } bool cmp1() { for(int i=e;i>=0;i--) { if(a[i]>b[i]) return true; if(a[i]<b[i]) return false; } return true; } bool judge() { for(int i=0;i<e;i++) if(a[i]) return false; return true; } void swap_array() { for(int i=0;i<e;i++) swap(a[i],b[i]); } void gcd() { if(!cmp1()) swap_array(); update(); for(int i=0;i<e;i++) { a[i]-=b[i]; if(a[i]<0) { a[i+1]-=1; a[i]+=10; } } if(!judge()) gcd(); return; } int main() { cin>>str1>>str2; for(int i=0;i<str1.size();i++) a[str1.size()-i-1]=str1[i]-'0'; for(int i=0;i<str2.size();i++) b[str2.size()-i-1]=str2[i]-'0'; gcd(); bool s=0; for(int i=e-1;i>=0;i--) { if(b[i]) s=1; if(s==1) cout<<b[i]; } return 0; }
Attention
这种小优化只能得64分~还是有点用的嘛!