大整数开方

#include
#include
#include
using namespace std;
const int SIZE=200;
struct T{
int len,num[SIZE];
};
//num[1]表示个位,num[2]表示十位,…
T times(T a,T b)//a*b
{
T ans;
memset(ans.num,0,sizeof(ans.num));
for(int i=1;i<=a.len;i++)
{
for(int j=1;j<=b.len;j++)
{
ans.num[i+j-1]+=a.num[i]*b.num[j];
}
}
for(int i=1;i<a.len+b.len;i++)
{
ans.num[i+1]+=ans.num[i]/10;
ans.num[i]%=10;
}
ans.len=a.len+b.len;
if(!ans.num[a.len+b.len])
{
ans.len–;
}
//要不要加一位
return ans;
}
T add(T a,T b)//a+b
{
T ans;
memset(ans.num,0,sizeof(ans.num));
if(a.len>b.len)
{
ans.len=a.len;
}
else{
ans.len=b.len;
}
for(int i=1;i<=ans.len;i++)
{
ans.num[i]+=a.num[i]+b.num[i];//+=
ans.num[i+1]+=ans.num[i]/10;
ans.num[i]%=10;
}
if(ans.num[ans.len+1])
{
ans.len++;
}
return ans;
}
T average(T a,T b)//a b平均数
{
T ans;
memset(ans.num,0,sizeof(ans.num));
ans=add(a,b);
for(int i=ans.len;i>=2;i–)
{
ans.num[i-1]+=(ans.num[i]%2)*10;//退位,注意是反着存的
ans.num[i]/=2;
}
ans.num[1]/=2;
if(!ans.num[ans.len])
{
ans.len–;
}
return ans;
}
T plustwo(T a)//a+2
{
T ans;
ans=a;
ans.num[1]+=2;
int i=1;
while((i<=ans.len) && (ans.num[i]>=10))
{
ans.num[i+1]+=ans.num[i]/10;
ans.num[i]%=10;
i++;
}
if(ans.num[ans.len+1])
{
ans.len++;
}
return ans;
}
bool over(T a,T b)//a>b
{
if(a.len<b.len)
{
return false;
}
if(a.len>b.len)
{
return true;
}
for(int i=a.len;i>=1;i–)
{
if(a.num[i]>b.num[i])
{
return true;
}
if(a.num[i]<b.num[i])
{
return false;
}
}
return false;
}
int main(){
string s;
T target,left,right,middle;
cin>>s;
memset(target.num,0,sizeof(target.num));
target.len=s.length();
for(int i=1;i<=target.len;i++)
{
target.num[i]=s[target.len-i]-‘0’;
}
memset(left.num,0,sizeof(left.num));
left.len=1;
left.num[1]=1;
right=target;
do{
middle=average(left,right);
if(over(times(middle,middle),target))
{
right=middle;
}
else{
left=middle;
}
}while(!over(plustwo(left),right));
for(int i=left.len;i>=1;i–)
{
cout<<left.num[i];
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/Mintind/article/details/82961625
今日推荐