条件:
设d(n)被定义为n(小于n的数平均分为n)的真除数之和。
如果d(a)=b和d(b)=a,其中a≠b,则a和b是友好对,a和b中的每一个都称为友好数。
例如,220的真除数是1、2、4、5、10、11、20、22、44、55和110;因此d(220)=284。284的真除数是1,2,4,71和142;所以d(284)=220。
计算10000以下所有友好数字的总和。
我做了以下工作:

    static void Main()
    {
        long sum = 0;
        List<int> passedValues = new List<int>();
        for (int i = 1; i < 10000; i++)
        {
            var number1 = SumOfNumber(i);
            var number2 = SumOfNumber(SumOfNumber(i));
            if (number2 == i && !passedValues.Contains(number1))
            {
                sum = sum + number1;
                passedValues.Add(number1);
                passedValues.Add(number2);
            }
        }
        Console.WriteLine(sum);
        Console.ReadKey();
    }

    private static int SumOfNumber(int input)
    {
        int sum = 0;
        for (int i = 1; i <= input/2; i++)
        {
            if (input%i == 0)
            {
                sum += i;
            }
        }
        return sum;
    }

然而,它给出的结果是40284,而正确的答案似乎是31626为什么我的程序不能正常工作?我是不是加了很多次我还尝试添加一个列表来存储传递的值,但是它最终给出了一个结果25008:
static void Main()
    {
        long sum = 0;
        List<int> passed = new List<int>();
        for (int i = 1; i < 10000; i++)
        {
            var number1 = SumOfNumber(i);
            var number2 = SumOfNumber(SumOfNumber(i));
            if (number2 == i && !passed.Contains(i))
            {
                sum = sum + number1;
                passed.Add(number1);
            }
        }
        Console.WriteLine(sum);
        Console.ReadKey();
    }

最佳答案

这里有两个问题:
你不能把两个友好的对数字相加。
你包含的是完全数(其中d(n)=n),因为a≠b被违反,所以不符合友好对的条件。
我认为当你没有在列表中添加来存储传递的数字时,你就更接近了,因为这导致了上面的问题1,因为你只在总和中添加了number1的贡献,但是在列表中同时添加了number1number2,最终导致number2被跳过要解决问题2,还需要验证number1 != number2。例如:

if (number2 == i && number1 != number2)
                 ^^^^^^^^^^^^^^^^^^^^^ add this check
{
    sum = sum + i;

在对您提供的代码应用这两个修复程序之后,我得到了预期的总数31626。

关于c# - 欧拉计划#21,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36439222/

10-12 05:06