高精度开方

  X的二分之一次方怎么求?二分!

  首先求整数部分,从1到X二分答案,选择最接近的那个

  然后是求第一位小数部分,用高精度乘法模拟平方,看看得出的数是否比X大,或者比X小,从0到9不断二分即可

  然后是第二位小数......

 

 

View Code
  1 #include<iostream>

  2 #include<string>

  3 #include<algorithm>

  4 using namespace std;

  5 

  6 int n,nlen;

  7 char str[22];

  8 int c[1000];

  9 int a[1000],b[1000],d[1000];

 10 

 11 int isok(int len)

 12 {

 13     memset(a,0,sizeof(a));

 14     memset(b,0,sizeof(b));

 15     int i,j,t;

 16     t=2*(len-1); //t 是小数的位数

 17     for(j=0,i=len-1;i>=0;i--)

 18     {

 19         a[j++]=c[i];

 20     }

 21     for(i=0;i<len;i++)

 22     {

 23         for(j=0;j<len;j++)

 24         {

 25             b[i+j]+=a[i]*a[j];

 26         }

 27     }

 28     len=2*len-1;

 29     for(i=0;i<len;i++)

 30     {

 31         b[i+1]+=b[i]/10;

 32         b[i]%=10;

 33     }

 34     while(b[len])

 35     {

 36         b[len+1]+=b[len]/10;

 37         b[len]%=10;

 38         len++;

 39     }

 40     if(len-t<nlen) //整数位数小于给定的N的长度,则返回小于

 41         return -1;

 42     if(len-t>nlen) //返回大于

 43         return 1;

 44     for(i=len-1,j=nlen-1;i>=0 && j>=0;i--,j--)

 45     {

 46         if(d[j]>b[i])

 47             return -1;

 48         if(d[j]<b[i])

 49             return 1;

 50     }

 51     while(i>=0)

 52     {

 53         if(b[i]) //整数部分相等,小数部分有值的话,返回大于

 54             return 1;

 55         i--;

 56     }

 57     return 0; //等于

 58 }

 59 

 60 int main()

 61 {

 62     int cas,i;

 63     freopen("in.txt","r",stdin);

 64     scanf("%d",&cas);

 65     while(cas--)

 66     {

 67         scanf("%d",&n);

 68         memset(c,0,sizeof(c));

 69         nlen=0;

 70         int l,r,t,mid,tt;

 71         t=n;

 72         while(t) //将输入的n转化成串的形式,便于比较大小

 73         {

 74             d[nlen]=t%10;

 75             nlen++;

 76             t/=10;

 77         }

 78         l=1;r=n;

 79         int flag=0; //标记是否相等

 80         while(l<=r) //求整数部分

 81         {

 82             mid=(l+r)/2;

 83             c[0]=mid;

 84             tt=isok(1);

 85             if(tt>0)

 86             {

 87                 r=mid-1;

 88             }

 89             else if(tt<0)

 90             {

 91                 

 92                 t=mid;

 93                 l=mid+1;

 94             }

 95             else if(tt==0) 

 96             {

 97                 t=mid;

 98                 flag=1;

 99                 break;

100             }

101         }

102         c[0]=t;

103         for(i=1;i<120;i++) //模拟开方的前119位小数

104         {

105             if(flag) //相等的话,就不用继续求了

106                 continue;

107             l=0;r=9;

108             while(l<=r)

109             {

110                 mid=(l+r)/2;

111                 c[i]=mid;

112                 tt=isok(i+1);

113                 if(tt>0)

114                 {

115                     r=mid-1;

116                 }

117                 else if(tt<0)

118                 {

119                     

120                     t=mid;

121                     l=mid+1;

122                 }

123                 else if(tt==0)

124                 {

125                     t=mid;

126                     flag=1;

127                     break;

128                 }

129             }

130             c[i]=t;

131         }

132         printf("%d.",c[0]);

133         for(i=1;i<120;i++)

134             printf("%d",c[i]);

135         printf("\n");

136     }

137     return 0;

138 }

你可能感兴趣的:(精度)