0

だから私は質問への答えを見つけようとしています:

3 または 5 の倍数である 10 未満の自然数をすべてリストすると、3、5、6、および 9 になります。これらの倍数の合計は 23 です。1000 未満の 3 または 5 のすべての倍数の合計を見つけます。

私は C# を使用しており、何をすべきかについてかなり良いアイデアを持っていますが、私のコードは 2 回発生する数字 (例: 15、30) を数え続けており、これに対抗する最も迅速で簡単な方法を知りたいです。これまでに見つけたものはすべて別の言語で書かれていたので、これが比較的簡単に思える場合は申し訳ありません。これは私がこれまでに持っているものです:

static void Main(string[] args)
    {
        var result1 = 0;
        var result2 = 0;
        var result3 = 0;
        var uniqueInts3 = new List<int>();
        for (var i = 0; i < 1000; i += 3)
        {
            uniqueInts3.Add(i);
            result1 += i;
        }
        var uniqueInts5 = new List<int>();
        for (var o = 0; o < 1000; o += 5)
        {
            uniqueInts5.Add(o);
            result2 += o;
        }
        result3 += result1 + result2;
        Console.WriteLine(result3);
        Console.ReadLine();
    }

現時点ではどうすればよいか分からないので、どなたか教えていただけると幸いです。

4

7 に答える 7

6

最も効率的な方法ではありませんが、うまくいくはずです

var sum = 0;

for(int i=0;i<1000;i++)
{
   if(i%3==0||i%5==0) //checks if something is multiple of 3 or 5
      sum+=i; // sums only when it's multiple of 3 or 5
}

何かが 3 と 5 の倍数である状況を省略します。各数値を 1 回とります。

1 行の linq の方法:

var sum = Enumerable.Range(3, 1000).Sum(x => (x % 3 == 0 || x % 5 == 0) ? x : 0);

最速の数学的アプローチのバージョン:

var result = SumDivisbleBy(3,999)+SumDivisbleBy(5,999)-SumDivisbleBy(15,999);

private int SumDivisbleBy(int n, int p)
{
    return n*(p/n)*((p/n)+1)/2;
}

3 と 5 で割り切れるすべての数値の合計を計算し、15 で割り切れる数値の合計を減算します。

于 2013-08-16T11:52:32.150 に答える
5
var sum = Enumerable.Range(1, 1000)
          .Where(i => i % 3 == 0 || i % 5 == 0)
          .Sum();
于 2013-08-16T11:54:13.160 に答える
3

代替アプローチを提供するためだけに...

まず、次の繰り返しシーケンスで、3 と 5 の倍数の間にギャップがあることがわかります。

2, 1, 3, 1, 2, 3, 3

それを考えると、次のように合計を計算するメソッドを書くことができます:

int sumMultiplesOf3And5UpTo(int n)
{
    int i = 3;
    int j = 0;
    int t = 0;

    int[] increments = new []{2, 1, 3, 1, 2, 3, 3};

    while (i <= n)
    {
        t += i;
        i += increments[j++%7];
    }

    return t;
}

究極の速度を得るには、次のように「インクリメント配列を展開」できます。

int sumMultiplesOf3And5UpTo(int n)
{
    int i = 3;
    int t = 0;

    while (true)
    {
        t += i;
        i += 2;
        if (i > n) break;

        t += i;
        i += 1;
        if (i > n) break;

        t += i;
        i += 3;
        if (i > n) break;

        t += i;
        i += 1;
        if (i > n) break;

        t += i;
        i += 2;
        if (i > n) break;

        t += i;
        i += 3;
        if (i > n) break;

        t += i;
        i += 3;
        if (i > n) break;
    }

    return t;
}

このように実際に実装することは決してありません。それは単なる好奇心です (そして別のアプローチの例です)。

于 2013-08-16T12:21:52.883 に答える
3

これが私の2セントです

バージョン 1、for ループを使用。

int sum = 0;
for(int i = 0; i < 10; i++)
    if (new[] {3, 5}.Any(n => i % n == 0)) 
        sum += i;

バージョン 2、C# Linq を使用

var sum =
    Enumerable.Range(1, 10 - 1)
       .Where(e => new[] { 3, 5 }.Any(n => e % n == 0))
       .Sum();

Enumerable.Range(1, 10 - 1)0 から 9 (10 未満) までの整数のシーケンスを作成します。

.Where(..)元のシーケンスをフィルタリングするメソッドです。

new[] {3, 5}3 と 5 のみを含む別のシーケンスを作成します。

.Any(n => e % n == 0)は 3 と 5 を取り、モジュロ演算は元のシーケンスの各数値に対して実行されます。結果が 0 の場合、Anyメソッドは true を返します。これは、Whereメソッドが結果に数値を含めることを意味します。

そして最後に合計があります。

于 2013-08-16T12:08:54.357 に答える
2

簡単な方法の 1 つは、1 から 1,000 までのすべての数値をループして、それらが 3 または 5 の倍数であるかどうかを確認することです。そうであればresult、ループ外の変数に追加するだけです。これはプロジェクト オイラーの質問なので、自分でコードを考えさせます。幸運を!

PS、 % operatorをチェックしてください。役に立ちます。

于 2013-08-16T11:53:35.823 に答える
1

私は少し遊んで、それが私の解決策です:

private static int sumMultiples(int max, int small, int big)
{
    int sum = 0;

    int diff_add = big - small;
    int diff = diff_add;
    int next = small;
    while (next < max)
    {
        sum += next;

        if (next + diff < max
            && (next + diff) % small != 0)
        {
            sum += next + diff;
        }
        diff += diff_add;

        next += small;
    }

    return sum;
}

while ループは max/small 回実行されます。

于 2013-08-16T13:25:37.097 に答える
1

WriteLine() の前に結果を取得するには、これを試してください

var sum = uniqueInts3.Concat(uniqueInts5).Distinct().Sum()

于 2013-08-16T11:53:48.717 に答える