欧拉计划 #21

KOP*_*EUE 5 c# oop algorithm

健康)状况 :

\n\n
\n

令 d(n) 定义为 n 的真因数之和(小于 n 的数能被 n 整除)。\n 如果 d(a) = b 且 d(b) = a,其中 a \xe2\x89 \xa0 b,则a和b是友好对,a和b称为友好数。

\n\n

例如,220的真因数是1、2、4、5、10、11、20、22、44、55和110;因此 d(220) = 284。284 的真因数是 1、2、4、71 和 142;所以 d(284) = 220。

\n\n

计算 10000 以下的所有友好数字的总和。

\n
\n\n

我做了以下事情:

\n\n
    static void Main()\n    {\n        long sum = 0;\n        List<int> passedValues = new List<int>();\n        for (int i = 1; i < 10000; i++)\n        {\n            var number1 = SumOfNumber(i);\n            var number2 = SumOfNumber(SumOfNumber(i));\n            if (number2 == i && !passedValues.Contains(number1))\n            {\n                sum = sum + number1;\n                passedValues.Add(number1);\n                passedValues.Add(number2);\n            }\n        }\n        Console.WriteLine(sum);\n        Console.ReadKey();\n    }\n\n    private static int SumOfNumber(int input)\n    {\n        int sum = 0;\n        for (int i = 1; i <= input/2; i++)\n        {\n            if (input%i == 0)\n            {\n                sum += i;\n            }\n        }\n        return sum;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而它给出的结果是 40284,而正确答案似乎是 31626 为什么我的程序不能正常工作?我是否多次添加某些内容?我还尝试添加一个列表来存储传递的值,但最终给出的结果是 25008 :

\n\n
static void Main()\n    {\n        long sum = 0;\n        List<int> passed = new List<int>();\n        for (int i = 1; i < 10000; i++)\n        {\n            var number1 = SumOfNumber(i);\n            var number2 = SumOfNumber(SumOfNumber(i));\n            if (number2 == i && !passed.Contains(i))\n            {\n                sum = sum + number1;\n                passed.Add(number1);\n            }\n        }\n        Console.WriteLine(sum);\n        Console.ReadKey();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

mel*_*okb 4

这里有两个问题:

\n\n
    \n
  1. 您没有将两个友好的数字相加到总和中。
  2. \n
  3. 您包含完美数(其中 d(n) = n),它们不符合友好对的资格,因为违反了 \xe2\x89\xa0 b 。
  4. \n
\n\n

我认为当您没有在列表中添加来存储传递的数字时,您会更接近,因为这导致了上面的问题#1,因为您只将 的贡献添加number1到总和中,但将 和 都添加number1number2列表中,导致number2最终得到跳过了。要解决问题 #2,您还需要验证number1 != number2. 例如:

\n\n
if (number2 == i && number1 != number2)\n                 ^^^^^^^^^^^^^^^^^^^^^ add this check\n{\n    sum = sum + i;\n
Run Code Online (Sandbox Code Playgroud)\n\n

将这两个修复应用到您提供的代码后,我得到的预期总数为 31626。

\n