测试是对的,但答案仍然是错的

本文关键字:答案 仍然是 测试 | 更新日期: 2023-09-27 18:07:50

在尝试使用数组解决c#中的Euler问题1后,我被指出只有在满足for()循环的条件时才添加单个变量。代码显然更好了,但是我看不出我做错了什么。

目标是取前1000个数字,找到3或5的因子,最后将因子相加。我在做前10个,我知道是23,然后再做1000个。控制台读取完美,直到for()循环完成,当我在最后问代码的最终答案,然而,它给了我33!代码如何在循环后向sum变量添加任何东西!!它在嘲弄我…

using System;
public class Problem1
{
    public static void Main()
    {
        int sum = 0;
        //assign range to evaluate factors and summation
        int maxNumber = 10;
        //test if i is a factor of 5 or 3
        for(int i = 1; i <= maxNumber; i++)
        {
            if (i % 3 == 0 || i % 5 == 0)
            {
                //WriteLine here to debug, the real magic here is adding i to sum when test is true
                Console.WriteLine(sum);
                sum += i;
            }
        }
        //and the final answer is?
        Console.WriteLine(sum);
        //uncomment below line if running in vbs
        Console.ReadLine();
    }
}

测试是对的,但答案仍然是错的

让我们"运行"你的代码:

  • 1 ?继续
  • 2 ?继续
  • 3 ?添加
  • 4 ?继续
  • 5 ?添加
  • 6 ?添加
  • 7 ?继续
  • 8 ?继续
  • 9 ?添加
  • 10 ?添加

10、9、6、5、3的和为33

因为maxNumber也被计算。

改变:

for(int i = 1; i <= maxNumber; i++) // i=3,5,6,9,10 => sum = 33

:

for (int i = 1; i < maxNumber; i++) // i=3,5,6,9  => sum = 23

 maxNumber == 10

选择的数字是3, 5, 6, 9, 10,和是33(不是23)。通解可能是这样的(Linq):

int sum = Enumerable
  .Range(1, maxNumber)
  .Where(item => (item % 3 == 0) || (item % 5 == 0))
  .Sum();

maxNumber == 1000时,答案为234168。如果想要排除 maxNumber,只需减去1:

int sum = Enumerable
  .Range(1, maxNumber - 1) // <- subtract 1
  .Where(item => (item % 3 == 0) || (item % 5 == 0))
  .Sum();

所以10的答案是23 1000的答案是233168