C# Euler 1项目:找出1000以下所有3或5的倍数之和,适用于10个数字,但不适用于';我不能工作1000英镑

C# Euler 1项目:找出1000以下所有3或5的倍数之和,适用于10个数字,但不适用于';我不能工作1000英镑,c#,algorithm,math,sum,C#,Algorithm,Math,Sum,如果我们列出10以下的所有自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。求1000以下所有3或5的倍数之和 所以我决定尝试在Euler站点上解决一些问题,以改进编程。当我试图解决第一个问题时,我写了一个快速代码来计算总数,它对10个数字有效,但对于1000个数字,它告诉我答案:166833这是错误的,我在这里找不到问题。如果有人能给我一个提示来改进我的算法,这样它就可以工作了 using System; using System.Collections.Generic;

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

所以我决定尝试在Euler站点上解决一些问题,以改进编程。当我试图解决第一个问题时,我写了一个快速代码来计算总数,它对10个数字有效,但对于1000个数字,它告诉我答案:166833这是错误的,我在这里找不到问题。如果有人能给我一个提示来改进我的算法,这样它就可以工作了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Multiplies_of_3_and_5
{
  class Program
  {
    static void Main(string[] args)
    {            
        int[] array = new int[7000];

        for (int j = 0; j<array.Length ;j++)
        {
            array[j] = j + 1;
        }

        int n = 1;
        int z = 1;
        int numbers = 0;

        for (int i = 0; i<999; i++)
        {
            if (array[i] == 3 * n )
            {
                n++;                    
                numbers += array[i];
            }

            else if (array[i] == 5 * z)
            {
                z++;
                numbers += array[i];
            }                                                           
        }
        Console.WriteLine(string.Join(" ", numbers));
        Console.ReadLine();
      }
   }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间将_3_和_5的_相乘
{
班级计划
{
静态void Main(字符串[]参数)
{            
int[]数组=新int[7000];

对于(int j=0;j您应该阅读模运算符(%)

static void main(字符串[]args)
{
整数和=0;
对于(int i=1;i<1000;i++){
如果(i%3==0 | | i%5==0){
总和+=i;
}
}
控制台写入线(总和);
}
为了给出解释,当对值执行整数除法时,模运算符给出余数

例如,6%3==0(3平均除以6),7%3==1(7除以3剩下1)

因此,要求3和5的所有倍数之和,只需检查该值是否被3或5等分(if语句),如果是,则将其添加到运行总和中


请注意,当你得到3和5的倍数时,你的算法会出错。在这种情况下,你永远不会将其添加到z。当达到15时,你还需要将其更改为,n将增加,但z不会增加。因此,第二个分支(“可除以5”)将不再触发


您可以同时使用两个标志,然后使用这些标志来增加数字,n和z,或者按照建议使用模运算。

听了您的提示后,我重新编写了代码,效果很好。但是这样做肯定很痛苦,所以我建议使用(%)来实现。无论如何,我也会在这里发布我的代码。再次感谢您的帮助

Enumerable.Range(1, 999).Sum(x => x % 3 == 0 || x % 5 == 0 ? x : 0);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Multiplies_of_3_and_5
{
  class Program
  {


    static void Main(string[] args)
    {

        int[] array = new int[7000];

        for (int j = 0; j < array.Length; j++)
        {
            array[j] = j + 1;
        }


        int n = 1;
        int z = 1;
        int numbers = 0;

        for (int i = 0; i < 999; i++)
        {

            if (array[i] == 3*n && array[i] == 5*z)
            {
                n++;
            }

            if (array[i] == 3 * n)
            {

                n++;
                numbers += array[i];
            }

            if (array[i] == 5 * z)
            {
                z++;
                numbers += array[i];
            }




        }
        Console.WriteLine(string.Join(" ", numbers));
        Console.ReadLine();

    }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间将_3_和_5的_相乘
{
班级计划
{
静态void Main(字符串[]参数)
{
int[]数组=新int[7000];
for(int j=0;j
创意计数3秒、5秒,并扣除15秒,因为两者都是,但只需要计数一次

int maxNum = 999;
int num3s = maxNum/3; // rounded down 333
int num5s = maxNum/5; // rounded down 199

int num15s = maxNum/15; // rounded down 66
知道有多少人还不能告诉我们总数。毕达哥拉斯来拯救我们

sum3s = 3+6+9+12+15 (=45)
sum5s = 5+10+15     (=30) 
sum15s = 15         (=15)
平均值=(最大值+最小值)/2

如果有奇数3、5或15,则平均数为偶数。或者有偶数,在这种情况下/2和偶数相互抵消

所以我们得到了

sumXs = (min+max)*numXs
在上述情况下,我们得到

sum3s = (3+15)/2*5 = 45
sum5s = (5+15)/2*3 = 30
sum15s = (15+15)/2*1 = 15


int sum = sum3s+sum5s-sum15s = 60;
另一个例子11

sum = (3+9)/2*3 + (5+10)/2*2 - 0 = 33
最后是3和5的总和,总计999

sum = (3+999)/2*333 + (5+995)/2*199 - (15+990)/2*66
    = 501*333 + 500*199 - (1005)*66/2 
    = 501*333 + 500*199 - 1005*33 
    =  166833 +   99500 -   33165
    =  233168

这也是程序的结果。

为什么不使用模运算符(%)相反?而且,你不需要循环来填充数组。你可以用一个循环,从3到1000。看看井,因为数组是从0开始的。所以如果我想得到1000个数字,我需要写999。如果我给程序1000,那么它读作1001。至少我在10个数字上测试时是这样认为的。你的前提似乎有缺陷。There不是1000以下的3或5的1000倍。你能澄清一下吗?我可能会尝试使用%…这可能会更简单、更符合逻辑,但我的版本有任何错误吗?从我的角度来看,它应该和%s一起计算,这工作得很好..虽然我对我的代码不太满意,但我已经知道怎么做了工作,但没有在这里使用它…谁知道为什么。我还有一个问题。这段代码如何绕过示例15两次计数的问题。我猜这是因为我们在这里有| |语句,所以当我们到达15,30等时。它只加一次和?我说得对吗?你的代码在15失败,因为你没有在15更新z(你点击了第一个if,增量n,但从不点击增量z,你必须这样做,因为15是5的倍数)。这段代码之所以有效,是因为你将所有3或5的倍数相加,这是我直接编码的条件。if(3的倍数或5的倍数)添加数字。15是两者的倍数,但它仍然只添加一次。添加与条件语句是分开的。好的。因为我真的想修复我的程序并使其工作,在你解释之后,我做了,它工作得很好,但肯定比你的更糟。将发布我的代码作为回答。非常感谢!我终于了解了它的工作原理。请确保您将代码中的循环更改为我所做的,并将其发布到下面。现在效果很好。我还添加了语句,以便程序不会计算乘以5和3两次的数字。嗯,这很简单,但我感觉好多了解决它后,哈。这会找到1000以下的3或5的倍数,而问题是找到这些倍数的总和。@Saedeas,谢谢,我知道有问题,请参阅更新的答案。这仍然不能解决所述的问题?知道有200个值不是吗
sum = (3+999)/2*333 + (5+995)/2*199 - (15+990)/2*66
    = 501*333 + 500*199 - (1005)*66/2 
    = 501*333 + 500*199 - 1005*33 
    =  166833 +   99500 -   33165
    =  233168