欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA应试技巧----大数开方

程序员文章站 2024-03-04 12:30:59
...

大数开方--牛顿迭代法:

如果一个数的位数为偶数个,那么这个数开方之后就有n/2位;

如果一个数的位数为奇数个,那么这个数开方之后就有n/2+1位;

我们以num=1000为例,位数为4,偶数,那么开方之后就有2位。我们从高位开始枚举。

首先枚举十位:

10*10=100 < 1000

20*20=400 < 1000

30*30=900 < 1000

40*40=1600 > 1000

则十位数字为3

枚举各位:

31*31=961 < 1000

32*32 =1024 > 1000

则个位数字为1

所以开方1000的结果为31。

下面的代码思路和上面的例子基本一样,稍加理解即可。其中要注意变量类型的选择和转换。

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static String n;
    public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		n = in.next();
		int length= n.length();
		int sqrtLen = 0;
		if (length % 2 == 0) {
			sqrtLen = length / 2;
		} else {
			sqrtLen = length / 2 + 1;
		}
		char[] ch = new char[sqrtLen];
		Arrays.fill(ch, '0');
		BigInteger beSqrtNum = new BigInteger(n);
		for (int i = 0; i < sqrtLen; i++) {
			for (char j = '1'; j <= '9'; j++) {
				ch[i] = j;
				String s = String.valueOf(ch);
				BigInteger sqrtNum = new BigInteger(s);
				BigInteger squareNum = sqrtNum.multiply(sqrtNum);
				if (squareNum.compareTo(beSqrtNum) == 1) {
					ch[i] -= 1;
					break;
				}
			}
		}
		System.out.println(String.valueOf(ch));
	}
}