这里的问题是仅使用FOR循环得到幂的总和(m ^ 0 + m ^ 1 + m ^ 2 + m ^ 3 .... + m ^ n)。意思是,不使用任何其他循环以及Math.pow();
甚至可能吗?到目前为止,我只能努力获得m ^ n,但其余的不是。
public static void main(String[] args){
Scanner scn = new Scanner(System.in);
int total = 1;
System.out.print("Enter value of m: ");
int m = scn.nextInt();
System.out.print("Enter value of n: ");
int n = scn.nextInt();
for (int i = 1; i <= n; i++){
total * m;
}
System.out.print(total);
}
假设m = 8;并且n = 4;
我给了'1,2,3,4'这是我需要的,但是我无法为我提供动力。
如果有人可以指导我如何做到这一点会很好,因为我对Java知识有限,似乎无法向前发展。
提前致谢!
答案 0 :(得分:6)
你可能想要像这样重写它:
m^0 + m^1 + m^2 + m^3.... + m^n = 1 + m * (1 + m * (1 + m * (.... ) ) )
你可以在一个for循环中完成。
这应该可以胜任(见评论中的解释):
public long count(long m, int pow) {
long result = 1;
for(int i = 0;i<pow; i++) {
result*=m +1;
}
return result;
}
答案 1 :(得分:4)
你可以嵌套循环。使用一个来计算功率,用另一个来计算它们。
答案 2 :(得分:2)
你可以在下面做:
int mul = 1;
total = 1;
for(int i=1;i<=n;i++) {
mul *= m;
total += mul;
}
System.out.println(total);
答案 3 :(得分:1)
您还可以使用几何系列的公式:
Sum[i = k..k+n](a^i) = (a^k - a^(k+n+1)) / (1 - a)
= a^k * (1 - a^(n+1)) / (1 - a)
有了这个,实现可以在单个for
循环(或2个简单for
循环)中完成:使用O(n)简单循环,或使用O(log n){{ 3}}
然而,缺点是数据类型必须能够保持至少(1 - a^(n+1))
,而通常总结只需要结果适合数据类型。
答案 4 :(得分:1)
您可以使用单个循环,即O(N)而不是嵌套循环,即O(N ^ 2)
long total = 1, power = m
for (int i = 1; i <= n; i++){
total += power;
power *= m;
}
System.out.print(total);
答案 5 :(得分:0)
这是解决方案:
for(int i=0;i<n;i++){
temp=1;
for(int j=0;j<=i;j++){
temp *= m;
}
total += temp;
}
System.out.println(total+1);
答案 6 :(得分:0)
您可以使用自己的pow
函数轻松计算能力,例如:
private static long power(int a, int b) {
if (b < 0) {
throw new UnsupportedOperationException("Negative powers not supported.");
}
if (b == 0) {
return 1;
}
if (b == 1) {
return a;
}
return a * power(a, b - 1);
}
然后简单地遍历所有值并添加它们:
long out = 0;
for (int i = 0; i <= n; ++i) {
out += power(m, i);
}
System.out.println(out);
我想补充一点,这是一个经典的动态编程问题,因为m^n
是m * m^(n-1)
。因此,我会添加先前计算的权限的缓存,以便您不必重新计算。
private static Map<Integer, Long> powers;
public static void main(String args[]) {
int m = 4;
int n = 4;
powers = new HashMap<>();
long out = 0;
for (int i = 0; i <= n; ++i) {
out += power(m, i);
}
System.out.println(out);
System.out.println(powers);
}
private static long power(int a, int b) {
if (b < 0) {
throw new UnsupportedOperationException("Negative powers not supported.");
}
if (b == 0) {
return 1;
}
if (b == 1) {
return a;
}
Long power = powers.get(b);
if (power == null) {
power = a * power(a, b - 1);
powers.put(b, power);
}
return power;
}
此缓存计算值,以便您每次只计算 next 倍数。