7

数値 N を指定して、差が 1 の算術進行を生成し、有限要素を合計した後に数値 N を取得します。たとえば、次のようになります。

For Example:
N=10
1 + 2 + 3 + 4 =10
N=20
2+3+4+5+6 = 20
N=30
4+5+6+7+8 = 30

N < 1000000

4

6 に答える 6

7
  1. 合計 = 0 から始めます。

  2. 現在の数字を 1 とします。

  3. 現在の数を合計に追加します。

  4. の場合sum > N、 まで合計に追加された最初の数値から数値を減算しますsum <= N

  5. sum = N(成功) の場合は停止します。

  6. 現在の数を増やします。

  7. 手順 3 から続行します。

ステップ 4 の合計に追加された最初の数値を覚えておく必要があります。これは、合計から減算すると 1 増加します (Niko に感謝します)。

最適化として、式 ( n(n+1)/2)を使用して、数値を 1 つずつ追加するのではなく、バッチで追加することもできます (Nが大きい場合)。

例:

N = 30

Sum = 0
Add 1 -> 1
Add 2 -> 3
Add 3 -> 6
Add 4 -> 10
Add 5 -> 15
Add 6 -> 21
Add 7 -> 28
Add 8 -> 36
36 > 30, so:
  Subtract 1 -> 35
  Subtract 2 -> 33
  Subtract 3 -> 30
Done.
于 2013-09-27T12:26:48.733 に答える
5

T を数とする

したがって、N=4 の最初のケースでは N(N+1)/2 = T

N(N+1)/2 - K(K+1)/2 = N=6 & K=1 の 2 番目のケースでは T

N(N+1)/2 - K(K+1)/2 = N=8 & K=3 の 3 番目のケースでは T

したがって、基本的に N について解くと、乗算と削減によって得られます

N^2 + N - (2T + K^2 + K) = 0

N= (-b + sqrt(b^2 - 4ac))/2a である N に二次式を適用する

N = (-1 +- sqrt(1 + 8T + 4K^2 + 4K))/2

負のケースを削除できるように、N は正でなければなりません

したがって、N は N = (sqrt(8T + (2k+1)^2) - 1)/2 と等しくなければなりません。答えとなる自然数 N が得られるまで、K=0 から繰り返すことができます。

それが役に立てば幸いです。私はこれを行っているので、より良い方法を見つけようとしています(興味深い問題に感謝します)

于 2013-09-27T12:35:48.650 に答える
2

ここN = pqで、pは奇数の正の整数で、qは任意の正の整数です。

(1)連続した整数Nの和として、中間値として書くことができます。pq

(2) また、 と が両方ともp奇数q(たとえば、 ) の場合、と を中間に置いて、連続した整数の和としてq = 2k+1書くこともできます。N2pkk+1

たとえば、みましょうN = 15 = 5 x 3

を選択するp=5と、ルール (1) に従って、 が得られ1+2+3+4+5 = 15ます。または、規則 (2) により、 と書くこともできます(-3)+(-2)+(-1)+0+1+2+3+4+5+6 = 15

p = 3取得する4+5+6 = 15ことも選択できます0+1+2+3+4+5 = 15

于 2013-09-27T13:03:32.577 に答える
2
int NumSum(int val)
{
    int n = 0, i = 0, j;
    while (n != val)
    {
        n = 0;
        j = ++i;
        while (n < val)
            n += j++;
    }
    return i;
}

複雑な計算は必要ありません。簡単な方法です。カウントを開始する数値を返します。

于 2013-09-27T13:08:36.133 に答える
1

これはよりトリックな方法であり、うまくいくと思います。

数が 10 であるとしましょう。次に、5 である n/2 からシーケンスを開始します。

10>11 であるため 5+6 であるため、逆方向に作業する必要があります。また、6+7 などの数は 10 を超えるため、考慮する必要がある数の上限は 5 であり、シーケンスの最後の数 (最大) は 5 になります。後方 5+4=9 < 10

5+4+3=12 > 10 なので、キューのような最初の要素を削除します。

したがって、20 の場合、start = 20/2 = 10 となります。

  1. 10 + 9 = 19 -> 何もしない
  2. 10 + 9 + 8 = 27 -> 10 である最初の要素を削除
  3. 9 + 8 + 7 = 24 -> 9 を削除
  4. 8 + 7 + 6 = 21 -> 8 を削除
  5. 7 + 6 + 5 = 18 -> 何もしない
  6. 7 + 6 + 5 + 4 = 22 -> 7 を削除
  7. 6 + 5 + 4 + 3 = 18 -> 何もしない
  8. 6 + 5 + 4 + 3 + 2 = 20 -> 必要な答え

これは受け入れられた回答のバリエーションだと思いますが、これを代替ソリューションとして追加できると考えていました。

于 2013-09-27T13:05:31.313 に答える