数値 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
の和として、中間値として書くことができます。p
q
(2) また、 と が両方ともp
奇数q
(たとえば、 ) の場合、と を中間に置いて、連続した整数の和としてq = 2k+1
書くこともできます。N
2p
k
k+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 となります。
これは受け入れられた回答のバリエーションだと思いますが、これを代替ソリューションとして追加できると考えていました。