1. 程式人生 > >51NOD_1166 大數開平方

51NOD_1166 大數開平方

1166_ 大數開平方

基準時間限制:4 秒 空間限制:131072 KB
分值: 320 難度:7級演算法題

給出一個大整數N,求不大於N的平方根的最大整數。例如:N = 8,2 * 2 < 8,3 * 3 > 8,所以輸出2。
Input
給出一個大數N(N的長度 <= 100000)。
Output
輸出不大於Sqrt(n)的最大整數。
Input示例
9
Output示例
3

思路:JAVA大數套牛頓迭代

AC程式碼:



import java.math.BigInteger;
import java.math.*;
import java.math
.BigInteger; import java.util.Scanner; import java.util.*; public class Main { public static void bigSqrt(){ Scanner cin=new Scanner(System.in); String s=cin.next(); BigInteger remain=BigInteger.ZERO; BigInteger odd=BigInteger.ZERO; BigInteger ans=BigInteger.ZERO
; // remain=BigInteger.ZERO; // odd=BigInteger.ZERO; // ans=BigInteger.ZERO; int group=0,k=0; if(s.length()%2==1) { group=s.charAt(0)-'0'; k=-1; } else { group=(s.charAt
(0)-'0')*10+s.charAt(1)-'0'; k=0; } for(int j=0;j<(s.length()+1)/2;j++) { if(j!=0) group=(s.charAt(j*2+k)-'0')*10+s.charAt(j*2+k+1)-'0'; odd=BigInteger.valueOf(20).multiply(ans).add(BigInteger.ONE); remain=BigInteger.valueOf(100).multiply(remain).add(BigInteger.valueOf(group)); int count=0; while(remain.compareTo(odd)>=0) { count++; remain=remain.subtract(odd); odd=odd.add(BigInteger.valueOf(2)); } ans=ans.multiply(BigInteger.TEN).add(BigInteger.valueOf(count)); } System.out.println(ans); cin.close(); return; } public static void main(String[] args) { Scanner cin=new Scanner(System.in); //int t=cin.nextInt(); bigSqrt(); cin.close(); } }