-2

Project Euler - 問題 1: 1000 未満の 3 または 5 のすべての倍数の合計を見つけます。

ここで同じ問題についての質問を見ると、私が解決しようとした方法はかなり悪いと思います。これを解決する最善の方法は何ですか?

そして私の他の質問: 合計値が答えと一致しません。foreach問題は、リストの値を書き出すときに、3 ではなく 705 から始まることだと思いますが、その理由はわかりません。誰かが私にそれを説明できれば幸いです。

これは私が今使っているコードです:

List<int> numbers = new List<int>();
for (int i = 3; i < 1000; i += 3)
{
    numbers.Add(i);
}
for (int j = 5; j < 1000; j += 5)
{
    numbers.Add(j);
}
numbers.ForEach(Console.WriteLine);
int sum1 = numbers.Sum();
Console.WriteLine(sum1);
Console.ReadLine();
4

7 に答える 7

4

これはProject Eulerの最初の問題です。

個人的には、ワンライナーを使用しました:

Enumerable.Range(0, 1000).Where(n => n % 3 == 0 || n % 5 == 0).Sum()

しかし、読みやすくするために long way を使用することもできます:

int sum = 0;
for (int i = 0; i < 1000; i++)
{
    if ((i % 3 == 0) || (i % 5 == 0))
    {
        sum = sum + i;
    }
}

モジュロ (%) 演算子の仕組みがわからない場合は、こちらをお読みになることをお勧めします。

問題自体の詳細が必要な場合は、Project Euler でアカウントを作成し、回答を入力して問題の概要を読んでください。

于 2013-06-03T18:00:32.373 に答える
4

これは、numbers重複を許可するためです。いくつかの重複があることに注意してください。たとえば、15、30、45 などの数字は 2 回追加されます。

交換

List<int> numbers = new List<int>();

ISet<int> numbers = new HashSet<int>();

HashSet重複する値を許可しないため、機能します。

于 2013-06-03T17:07:12.007 に答える
3

3と5の両方の倍数である数を考慮していない

私があなただったら、次のようなものを持っているでしょう

for(int i=1; i<1000; i++)
{
    if(i is a multiple of 15)
        //account for 15
    else if(i is a multiple of 3)
        //account for 3
    else if(i is a multiple of 5)
        //account for 5
}
于 2013-06-03T17:03:28.007 に答える
3

出力が 705 で始まる理由は、数字のリストが非常に長い (正確には 532 の数字) ためです。スクロールを開始する前に、コンソール ウィンドウに表示できるのは数行だけです。

数字の 3 から始めますが、それは目に見えません。

于 2013-06-03T17:06:58.987 に答える
2

他の人が指摘したように、問題は、コードが 15 の倍数を 2 回カウントすることです。もちろん、このタスクは、LinqRangeWhereメソッドを使用すると非常に簡単です。

var numbers = Enumerable.Range(0, 1000)
                        .Where(n => n % 3 == 0 || n % 5 == 0);
foreach(var n in numbers)
{
    Console.WriteLine(n);
}

var sum = numbers.Sum();
Console.WriteLine(sum);
Console.ReadLine();
于 2013-06-03T17:11:26.390 に答える