2011年NOIP初赛普及组真题完善程序2:(大整数开方) 输入一个正整数n(1≤n≤10100),试用二分法计算它的平方根的整数部分。
#include<iostream> #include<string> using namespace std; const int SIZE=200; struct hugeint{ int len,num[SIZE]; }; //其中len表示大整数的位数;num[1]表示个位,num[2]表示十位,以此类推 hugeint times(hugeint a,hugeint b) // 计算大整数a和b的乘积 { int i,j; hugeint ans; memset(ans.num,0,sizeof(ans.num)); for(i=1;i<=a.len;i++) for(j=1;j<=b.len;j++) [ ① ] +=a.num[i]*b.num[j]; for(i=1;i<=a.len+b.len;i++){ ans.num[i+1]+=ans.num[i]/10; [ ② ]; } if(ans.num[a.len+b.len]>0) ans.len=a.len+b.len; else ans.len=a.len+b.len-1; return ans; } hugeint add(hugeint a,hugeint b) //计算大整数a和b 的和 { int i; hugeint ans; memset(ans.num,0,sizeof(ans.num)); if(a.len>b.len) ans.len=a.len; else ans.len=b.len; for(i=1;i<=ans.len;i++){ ans.num[i]+= [ ③ ] ; ans.num[i+1]+= ans.num[i]/10; ans.num[i]%=10; } if(ans.num[ans.len+1]>0) ans.len++; return ans; } hugeint average(hugeint a,hugeint b) //计算大整数a和b的平均数的整数部分 { int i; hugeint ans; ans=add(a,b); for(i=ans.len;i>=2;i--){ ans.num[i-1]+=([ ④ ])*10; ans.num[i]/=2; } ans.num[1]/=2; if(ans.num[ans.len]==0) ans.len--; return ans; } hugeint plustwo(hugeint a) // 计算大整数a加2之后的结果 { int i; hugeint ans; ans=a; ans.num[1]+=2; i=1;