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