大数的N次幂

/*
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值