簡體   English   中英

歐拉計划#21

[英]Project Euler #21

條件:

令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();
    }

這里有兩個問題:

  1. 您沒有將兩個友好對編號相加。
  2. 您包括了完美數(其中d(n)= n),因為違反了a≠b,所以它們不適合作為友好對。

我認為當您不添加列表來存儲傳遞的數字時,您就更近了,因為這導致了上面的問題#1,因為您只將number1的貢獻添加到總和中,但是將number1number2都添加到了列表中number2最終被跳過。 要解決問題2,您還需要驗證number1 != number2 例如:

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

將這兩個修復程序應用於您提供的代碼后,我得到的預期總數為31626。

我得到的結果是31626。這里的區別是如何防止總和重復。 只是確保我始終小於number1,而不是保存到列表中。

 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 && i < number1)
            {
                sum = sum + i + number1;

            }
        }
        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;
    }
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;
}

這是不正確的。 您只添加了其中一個因素,而沒有增加數字的平方根。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM