组合题8 个小题
已作答 0 / 8
完善程序 (大整数开方) 输入一个正整数 n(1≤n≤10100),试用二分法计算它的平方根的整数部分。
1#include<iostream>2#include<string>3using namespace std;4 5const int SIZE=200;6struct hugeint{7 int len,num[SIZE];8};9//其中len表示大整数的位数;num[1]表示个位,num[2]表示十位,以此类推10 11hugeint times(hugeint a,hugeint b)12// 计算大整数a和b的乘积13{14 int i,j;15 hugeint ans;16 memset(ans.num,0,sizeof(ans.num));17 for(i=1;i<=a.len;i++)18 for(j=1;j<=b.len;j++)19 [ ① ] +=a.num[i]*b.num[j];20 for(i=1;i<=a.len+b.len;i++){21 ans.num[i+1]+=ans.num[i]/10;22 [ ② ];23 }24 if(ans.num[a.len+b.len]>0)25 ans.len=a.len+b.len;26 else27 ans.len=a.len+b.len-1;28 return ans;29}30 31hugeint add(hugeint a,hugeint b)32//计算大整数a和b 的和33{34 int i;35 hugeint ans;36 memset(ans.num,0,sizeof(ans.num));37 if(a.len>b.len)38 ans.len=a.len;39 else40 ans.len=b.len;41 for(i=1;i<=ans.len;i++){42 ans.num[i]+= [ ③ ] ;43 ans.num[i+1]+= ans.num[i]/10;44 ans.num[i]%=10;45 }46 if(ans.num[ans.len+1]>0)47 ans.len++;48 return ans;49}50 51hugeint average(hugeint a,hugeint b)52//计算大整数a和b的平均数的整数部分53{54 int i;55 hugeint ans;56 ans=add(a,b);57 for(i=ans.len;i>=2;i--){58 ans.num[i-1]+=([ ④ ])*10;59 60 ans.num[i]/=2;61 }62 ans.num[1]/=2;63 if(ans.num[ans.len]==0)64 ans.len--;65 return ans;66}67 68hugeint plustwo(hugeint a)69// 计算大整数a加2之后的结果70{71 int i;72 hugeint ans;73 ans=a;74 ans.num[1]+=2;75 i=1;76 while( (i<=ans.len)&&(ans.num[i]>=10) ){77 ans.num[i+1]+=ans.num[i]/10;78 ans.num[i]%=10;79 i++;80 }81 if(ans.num[ans.len+1]>0)82 [ ⑤ ];83 return ans;84}85 86bool over(hugeint a,hugeint b)87// 若大整数a>b则返回true,否则返回false88{89 int i;90 if([ ⑥ ])91 return false;92 if( a.len>b.len )93 return true;94 for(i=a.len;i>=1;i--){95 if(a.num[i]<b.num[i])96 return false;97 if(a.num[i]>b.num[i])98 return true;99 }100 return false;101}102 103int main()104{105 string s;106 int i;107 hugeint target,left,middle,right;108 cin>>s;109 memset(target.num,0,sizeof(target.num));110 target.len=s.length();111 for(i=1;i<=target.len;i++)112 target.num[i]=s[target.len-i]-[ ⑦ ];113 memset(left.num,0,sizeof(left.num));114 left.len=1;115 left.num[1]=1;116 right=target;117 do{118 middle=average(left,right);119 if(over([ ⑧ ]))120 right=middle;121 else122 left=middle;123 }while(!over(plustwo(left),right) );124 for(i=left.len;i>=1;i--)125 cout<<left.num[i];126 return 0;127}③处应填( )