/*
23'01781.98234'06000的5次方根
第1步:高位段向低位段逐段: 初值a=0,c=23(最高段)
第2步:找b,条件:(10*a+b)^n-(10*a)^n<=c,即b^5<=23,且为最大值;
显然b=1 差c=23-b^5=22,与下一段合成, c=c*10^n+下一段=22*10^5+01781=2201781
第3步:a=1(计算机语言赋值语句写作a=10*a+b),找下一个b......
*/
string BigNum :: BigSqrtN(string s1, int n)
{
int i, j, f, f1, l, l1;
string a, b, c, r, t, t1, t2, t3, tp, st, st1, st2;
//cin>>s1;
l1 = s1.size();
for(i=0, f=0, f1=0; i<l1; ++i)
{
if(f1==0)
{
if(s1[i]=='0'&&i<l1&&s1[i+1]!='.'&&i!=l1-1)// 被加数整数部分除前0--保留小数点前一个0
{
continue;
}
else
{
f1 = 1;
}
}
if(s1[i]=='.')
{
f = 1;
continue;
}
if(f==0)// 整数部分
{
st1 += s1[i];
}
else// 小数部分
{
st2 += s1[i];
}
}
l1 = st1.size();
l = l1 % n;
if(l==0)// 整除则l为n
{
l = n;
}
b = "0";
c = "0";
a = "0";
i = 0;
f = 0;// 用于判断是否整次方根
while(i<l1)// 整数部分
{
a = BigAdd(BigMul("10", a), b);// a = 10*a + b
for(j=0; j<l; ++i, ++j)// 从高取l位数
{
t += st1[i];
}
c = BigAdd(c, t);// c = c + t--前c值与下一段合成
st = "1";
t2 = BigMul("10", a);// t2 = 10*a
tp = t2;
for(j=1; j<n; ++j)// t2 = t2^n
{
t2 = BigMul(t2, tp);
}
for(b="0"; st>"0"; b=BigAdd(b, "1"))// 找满足b^n<=c且b^n为最大值的b值
{
t3 = t1;
t1 = BigAdd(BigMul("10", a), b);// t1 = 10*a + b
tp = t1;
for(j=1; j<n; ++j)// t1 = t1^n
{
t1 = BigMul(t1, tp);
}
st = BigSub(t1, t2);// t1 - t2
st = BigSub(c, st);// (10*a+b)^n与(10*a)^n比较
}
if(st=="0")// 整次方根(整数部分)
{
f = 1;
b = BigSub(b, "1");// 比较过程中多加了1次
c = BigSub(c, BigSub(t1, t2));// c=c-((10*a+b)^n-(10*a)^n)--求c差值
}
else
{
b = BigSub(b, "2");// 比较过程中多加了2次
c = BigSub(c, BigSub(t3, t2));// c=c-((10*a+b)^n-(10*a)^n)--求c差值
}
t = "10";
tp = t;
for(j=1; j<n; ++j)// 10^n
{
t = BigMul(t, tp);
}
c = BigMul(c, t);// c = c*10^n
t.erase(0, t.size());
r += b;// 保存结果
l = n;// l赋为n(第1部分可能不满n位)
}
l1 = st2.size();
if(f!=1||l1!=0)// 整数部分非整次方根或没有小数部分
{
r += '.';;// 加入小数点
l = l1 % n;// 补尾(使其为n的整数倍)
i = 0;
while(i<l1+l+J*n)// 找满足b^n<=c且b^n为最大值的b值
{
a = BigAdd(BigMul("10", a), b);// a = 10*a + b
for(j=0; j<n; ++i, ++j)// 从高取n位数
{
if(i<l1)
{
t += st2[i];
}
else
{
t += '0';
}
}
c = BigAdd(c, t);// c = c + t--前c值与下一段合成
st = "1";
t2 = BigMul("10", a);// t2 = 10*a
tp = t2;
for(j=1; j<n; ++j)// t2 = t2^n
{
t2 = BigMul(t2, tp);
}
for(b="0"; st>"0"; b=BigAdd(b, "1"))// 找满足b^n<=c且b^n为最大值的b值
{
t3 = t1;
t1 = BigAdd(BigMul("10", a), b);// t1 = 10*a + b
tp = t1;
for(j=1; j<n; ++j)
{
t1 = BigMul(t1, tp);// t1 = t1^n
}
st = BigSub(t1, t2);// t1 - t2
st = BigSub(c, st);// (10*a+b)^n与(10*a)^n比较
}
if(st=="0")// 整次方根(整数部分)
{
b = BigSub(b, "1");// 比较过程中多加了1次
c = BigSub(c, BigSub(t1, t2));// c=c-((10*a+b)^n-(10*a)^n)--求c差值
}
else
{
b = BigSub(b, "2");// 比较过程中多加了2次
c = BigSub(c, BigSub(t3, t2));// c=c-((10*a+b)^n-(10*a)^n)--求c差值
}
t = "10";
tp = t;
for(j=1; j<n; ++j)// 10^n
{
t = BigMul(t, tp);
}
c = BigMul(c, t);// c = c*10^n
t.erase(0, t.size());
r += b;// 保存结果
}
}
s1 = r;
cout<<s1<<endl;
return s1;
}