1

ここでの問題は、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」を提供しますが、m ^ i に電力を供給することができません。

Javaの知識が限られているため、先に進むことができないようです。

前もって感謝します!

4

7 に答える 7

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;
}
于 2013-09-06T13:29:08.180 に答える
4

ループをネストできます。1 つを使用してべき乗を計算し、もう 1 つを使用してそれらを合計します。

于 2013-09-06T13:26:55.727 に答える
2

以下で行うことができます:

int mul = 1;
total = 1;
for(int i=1;i<=n;i++) {
    mul *= m;
    total += mul;
}
System.out.println(total);   
于 2013-09-06T13:39:58.133 に答える
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これにより、実装は 1 つのループ (または 2 つの単純なループ)で実行できますfor: O(n) の単純なループ、または2 乗による O(log n) のべき乗のいずれかです。

ただし、欠点は、データ型が少なくとも を保持できる必要があることですが(1 - a^(n+1))、通常、合計するには結果がデータ型に収まる必要があるだけです。

于 2013-09-06T13:42:37.787 に答える
1

O(N^2) であるネストされたループの代わりに、O(N) である単一のループを使用できます。

long total = 1, power = m
for (int i = 1; i <= n; i++){   
    total += power;
    power *= m;
}
System.out.print(total);
于 2013-09-06T13:42:48.703 に答える
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);
于 2013-09-06T13:30:59.827 に答える
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;
}

これにより、計算された値がキャッシュされるため、毎回の倍数のみを計算できます。

于 2013-09-06T13:39:17.457 に答える