数値 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
合計 = 0 から始めます。
現在の数字を 1 とします。
現在の数を合計に追加します。
の場合sum > N、 まで合計に追加された最初の数値から数値を減算しますsum <= N。
sum = N(成功) の場合は停止します。
現在の数を増やします。
手順 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.
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 から繰り返すことができます。
それが役に立てば幸いです。私はこれを行っているので、より良い方法を見つけようとしています(興味深い問題に感謝します)
ここ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。
int NumSum(int val)
{
int n = 0, i = 0, j;
while (n != val)
{
n = 0;
j = ++i;
while (n < val)
n += j++;
}
return i;
}
複雑な計算は必要ありません。簡単な方法です。カウントを開始する数値を返します。
これはよりトリックな方法であり、うまくいくと思います。
数が 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 となります。
これは受け入れられた回答のバリエーションだと思いますが、これを代替ソリューションとして追加できると考えていました。