求a + aa + aaa + aaaa + aa…a的值
逻辑
Integer的最大值是2147483647。
在幂的运算下容易超过范围。这里也提供了大值运算应用的BigInteger进行求解。BigInteger提供了雷同Math的各种算法方法,也方便使用。
int baseLength = args[0].startsWith("-") ? args[0].length() - 1 : args[0].length();
int exponentLength = args[1].startsWith("-") ? args[1].length() -1 : args[1].length();
if (baseLength + exponentLength > 2) {
Long base = Long.valueOf(args[0]);
Long size = Long.valueOf(args[1]);
BigInteger bigBase = BigInteger.valueOf(base);
BigInteger sum = BigInteger.valueOf(0);
for (int i = 0; i < size; i++) {
sum = sum.add(bigBase.multiply(BigInteger.valueOf((long) Math.pow(10, i))));
}
System.out.println("结果是: " + sum);
} else {
Integer base = Integer.valueOf(args[0]);
Integer size = Integer.valueOf(args[1]);
int sum = 0;
for (int i = 0; i < size; i++) {
sum = Math.addExact(sum, Math.multiplyExact(base, (int) Math.pow(10, i)));
}
System.out.println("结果是: " + sum);
}
BigInteger需要使用自身方法进行运算,基础运算符不接受BigInteger。Math也是使用基础运算符进行运算,但增加了对范围的监测,更安全。
public static int addExact(int x, int y) {
int r = x + y;
// HD 2-12 Overflow iff both arguments have the opposite sign of the result
if (((x ^ r) & (y ^ r)) < 0) {
throw new ArithmeticException("integer overflow");
}
return r;
}
public static int multiplyExact(int x, int y) {
long r = (long)x * (long)y;
if ((int)r != r) {
throw new ArithmeticException("integer overflow");
}
return (int)r;
}
实例
此题不涉及负数幂,如果输入的幂为负数,pow()方法会返回结果0,这里可以不用另外添加条件过滤。
求n范围以内的完数
逻辑
一个数如果等于它的因子之和,就称为完数。
Integer num = Integer.valueOf(args[0]);
for (int i = 1; i <= num; i++) {
int sum = 0;
for (int j = 1; j < i; j++) {
if (Math.floorMod(i, j) == 0) {
sum += j;
}
}
if (i == sum) {
System.out.println(i);
}
}
实例
找出1000以内的所有完数
求反弹n次后的高度和总经过的距离
逻辑
/**
* arg[0] 初始高度
* arg[1] 反弹高度比
* arg[2] 反弹的次数
*/
Double height = Double.valueOf(args[0]);
Double rate = Double.valueOf(args[1]);
Integer count = Integer.valueOf(args[2]);
Double sum = Double.valueOf(0);
for (int i = 0; i < count; i++) {
height = height * rate;
sum += height;
}
System.out.println("高度是:" + height);
System.out.println("总经过的距离是:" + sum);
实例
一个球从100米高度自由落下,每次落地后反跳回原高度的一半再落下。求它在第10次落地时,共经过多少米?第10次反弹多高?