健康)状况 :
\n\n\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 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\nstatic 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
这里有两个问题:
\n\n我认为当您没有在列表中添加来存储传递的数字时,您会更接近,因为这导致了上面的问题#1,因为您只将 的贡献添加number1
到总和中,但将 和 都添加number1
到number2
列表中,导致number2
最终得到跳过了。要解决问题 #2,您还需要验证number1 != number2
. 例如:
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