:私が何を考えてどのように階数のシーケンスを合計するには?私は、次の手順合計することができますどのように
⌊n∕2⌋ + ⌊n+1∕2⌋ + ⌊n+2∕2⌋ + ...... + (n-1)
は床を破棄し、各フロア内で何を合計です! これは単なる推測です。
は私に私がn
も、その後、floor(n/2) == floor((n+1)/2)
であると仮定すると、それらを
おかげ
:私が何を考えてどのように階数のシーケンスを合計するには?私は、次の手順合計することができますどのように
⌊n∕2⌋ + ⌊n+1∕2⌋ + ⌊n+2∕2⌋ + ...... + (n-1)
は床を破棄し、各フロア内で何を合計です! これは単なる推測です。
は私に私がn
も、その後、floor(n/2) == floor((n+1)/2)
であると仮定すると、それらを
おかげ
を合計することができます任意のヒントまたは一般式を与えます。そしてfloor((n+2)/2) == floor(n/2) + 1
。
パズルのもう1つの部分は、算術シーケンスの合計の式です。これは、hereです。
あなたはプログラミングQ &のサイトを頼んでいるので、計算上の回答が必要だと思います。ここに...
int sum = 0;
for (int j=0; j<n-1; ++j) {
sum += (n+j)/2;
}
int
は自動的に床に切り捨てられます。
あまりスマートなお尻の答えはこれです。 Let n = 2k
。その後、合計が
k + k + k+1 + k+1 + ... + 2k-1 + 2k-1 = 2(k + k+1 + ... + 2k-1)
になり、あなたはそれを終えるために代数のビットと式
1 + 2 + ... + a = a(a+1)/2
を使用することができます。あなたができる1..20任意の範囲のための
:
sum = (1..20).inject{|sum, n| sum + (n/2.0).floor}
そしてもちろん、あなたが任意の範囲を使用することができます。この例はRubyにありますが、多くの言語で同様のことができます - アルゴリズムは同じです。
賢明なアルゴリズムや最適化を求めていない限り、私が考えることができる最も簡単なアプローチは、古い信頼できるループです。 C#では、これを実行するための1つの方法は、このようなものになります。
namespace Practice
{
using System;
public class SequenceAggregator
{
public double FirstElement
{
get;
set;
}
public int Length
{
get;
set;
}
public double Calculate()
{
double sum = 0;
for (var i = FirstElement; i < FirstElement + Length; i++)
{
sum += Math.Floor(i/2);
Console.WriteLine("i={0}, floor(i/2)={1}, sum={1}",
i, Math.Floor(i/2), sum);
}
return sum;
}
}
}
をそして、あなたは次のようにこのクラスを使用することができます。
namespace Practice
{
using System;
class Program
{
static void Main(string[] args)
{
SequenceAggregator a = new SequenceAggregator();
a.FirstElement = 1;
a.Length = 3;
Console.WriteLine("Sum:{0}", a.Calculate());
}
}
}
nは整数であることが保証されていますか? – ggreiner
それは私によく定義されたシーケンスのようには見えませんが、あなたは生成関数を詳しく説明できますか? – RussS