牛顿迭代法:
如果一个数的位数为偶数个,那么这个数开方之后就有n/2位;
如果一个数的位数为奇数个,那么这个数开方之后就有n/2+1位;
比如1000,那么开方后的长度为2.
对于10位,我们从1考虑到9,比如:
10*10=100<1000
20*20=400<1000;
30*30=900<1000;
40*40=1600>1000;
所以开方后的数在30-40之间,然后同理枚举个位。
import java.util.Arrays;
import java.util.Scanner;
import java.math.BigInteger;
public class Main{
void Sqrt(String s){
int len=s.length();
int sqrtlen;
if(len%2==0) sqrtlen=len/2;
else sqrtlen=len/2+1;
char ch[]=new char[sqrtlen];
Arrays.fill(ch,'0');
BigInteger num=new BigInteger(s);
for(int i=0;i<sqrtlen;i++){
for(char j='0';j<='9';j++){
ch[i]=j;
BigInteger temp=new BigInteger(String.valueOf(ch));
if((temp.multiply(temp)).compareTo(num)==1){
ch[i]-=1;
break;
}
}
}
System.out.println(String.valueOf(ch));
}
public static void main(String args[]){
Scanner cin=new Scanner(System.in);
String num=cin.next();
Main test=new Main();
System.out.println("开方后的数为:");
test.Sqrt(num);
}
}