<hdu-OJ>|| 2040_親和數

宇宙涼涼發表於2020-09-29

親和數

Time Limit: 2000/1000 MS (Java/Others) 
Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 67865    
Accepted Submission(s): 41135

Problem Description

古希臘數學家畢達哥拉斯在自然數研究中發現,
220的所有真約數(即不是自身的約數)之和為:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真約數為1、2、4、71、 142,加起來恰好為220。
人們對這樣的數感到很驚奇,並稱之為親和數。
一般地講,如果兩個數中任何一個數都是另一個數的真約數之和,
則這兩個數就是親和數。

你的任務就編寫一個程式,判斷給定的兩個數是否是親和數

Input

輸入資料第一行包含一個數M,接下有M行,每行一個例項,包含兩個整數A,B; 其中 0 <= A,B <= 600000 ;

Output

對於每個測試例項,如果A和B是親和數的話輸出YES,否則輸出NO。

Sample Input

2
220 284
100 200

Sample Output

YES
NO


Problem - 2040

Submit

唯二需要注意的就是題主給出的數值範圍!
[0, 600000] -> int 型別無法容納 <- (2^15 - 1)

#include <stdio.h>
#include <stdlib.h>

long fun(long digit)
{
    if (digit == 0) {
        return 0;
    } else if (digit == 1) {
        return 1;
    } else {
        int sum = 1;
        for (int i = 2; i < digit; i++)
        {
            if (digit % i == 0)
                sum += i;
        }

        return sum;
    }
}

int main()
{
    int num = 0;
    long digitA, digitB;
    long sumA, sumB;
    scanf("%d", &num);

    for (int no = 0; no < num; no++)
    {
        scanf("%ld %ld", &digitA, &digitB);
        sumA = sumB = 0;

        sumA = fun(digitA);
        sumB = fun(digitB);
        if (sumA == digitB && sumB == digitA)
            printf("YES\n");
        else printf("NO\n");
    }
}

相關文章