Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何停止添加在C中出现两次的数字#_C#_.net_Visual Studio 2010_Math - Fatal编程技术网

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

C# 如何停止添加在C中出现两次的数字#,c#,.net,visual-studio-2010,math,C#,.net,Visual Studio 2010,Math,所以我试图找到这个问题的答案: 如果我们列出10以下的所有自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。 求1000以下所有3或5的倍数之和 我正在使用C#,并且对该做什么有很好的想法,但是我的代码一直在计算两次出现的数字(例如15、30),我想知道最快/最简单的方法来抵消这一点。到目前为止,我所发现的一切都是用不同的语言表达的,所以如果你觉得这相对容易的话,我很抱歉。这就是我到目前为止所做的: static void Main(string[] args) {

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

如果我们列出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();
    }
static void Main(字符串[]args)
{
var结果1=0;
var result2=0;
var结果3=0;
var uniqueInts3=新列表();
对于(变量i=0;i<1000;i+=3)
{
唯一性3.添加(i);
结果1+=i;
}
var uniqueInts5=新列表();
对于(变量o=0;o<1000;o+=5)
{
唯一性5.添加(o);
结果t2+=o;
}
结果3+=结果1+结果2;
控制台写入线(结果3);
Console.ReadLine();
}

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

这不是最有效的方法,但应该有效

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
}
最快数学方法版本:

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整除的数字之和。说明:

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


另外,请查看,它会对您有所帮助。

在编写Line()之前尝试此操作以获得结果

var sum=uniqueInts3.Concat(uniqueInts5.Distinct().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;
可枚举。范围(1,10-1)
创建从0到9(小于10)的整数序列

。其中(..)
是一种过滤原始序列的方法

new[]{3,5}
创建另一个仅包含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;
}

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

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

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;
}
private static int summaultiples(int max、int small、int big)
{
整数和=0;
int diff_add=大-小;
int diff=diff_add;
int next=小;
while(下一个

while循环运行的次数最多/很少。

如果在同一个结果中添加所有整数,然后删除重复项,然后对其求和,会怎么样?作为一个非常附带的注释,如果您计划在生成列表时检查重复项,那么使用
HashSet
。请求的范围是1000,而不是10:)我认为在这里使用数组(
new[]{3,5}
)有点过火(只是我的观点):)我试图通过使用数组证明的是,您可以在不改变算法的情况下将其用作输入参数。对于10/1000的事情,来吧,男人:)10/1000很好![SpaceSpace]O(1)解决方案必须是赢家。:)@马修沃森:谢谢,但你的观察也令人印象深刻:)
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;
}
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;
}