如何停止添加C#中出现两次的数字

本文关键字:两次 数字 添加 何停止 | 更新日期: 2023-09-27 18:27:59

所以我正试图找到这个问题的答案:

如果我们列出所有10以下的自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。求出1000以下所有3或5的倍数之和。

我正在使用C#,并且很清楚该怎么做,但我的代码一直在计算出现两次的数字(例如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();
    }

如果有人能向我解释该怎么做,我会很高兴的,因为我现在还不确定。

如何停止添加C#中出现两次的数字

不是最有效的方法,但应该可以使用

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的倍数的情况。每个数字取一次。

单线线路:

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整除的数字的和。说明:http://www.wikihow.com/Sum-the-Integers-from-1-to-N

var sum = Enumerable.Range(1, 1000)
          .Where(i => i % 3 == 0 || i % 5 == 0)
          .Sum();

这是我的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(..)是一种对原始序列进行过滤的方法。

CCD_ 3创建另一个仅包含3和5的序列。

.Any(n => e % n == 0)取3和5,并且对原始序列中的每个数字执行模运算。在结果为0的情况下,Any方法返回true,这反过来意味着Where方法在结果中包括数字。

最后是总和。

只是为了提供一种替代方法。。。

首先,我们可以观察到,在以下重复序列中,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;
}

我永远不会真的这样实施它;这只是一种好奇(也是一种不同方法的例子)。

一种简单的方法是循环从1到1000的所有数字,看看它们是3还是5的乘积,如果是,只需将它们添加到循环外的result变量中。由于这是一个项目euler问题,我会让你自己计算代码。祝你好运

附言,查看%运算符,它会帮你的。

尝试在WriteLine()之前获得结果

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

我玩了一会儿,这就是我的解决方案:

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循环运行最大/最小次数。