d010. 盈數、虧數和完全數

解法一、窮舉 2 ~ n

窮舉 22 ~ nn 之間所有的數
計算因數總和

✅ 完整代碼

評分結果(參考) : AC (3ms, 336KB)

#include<bits/stdc++.h>
using namespace std;

int f(int num){
    int sum = 1;
    for(int i=2; i<num; i++){
        if(num%i == 0) sum += i;
    }
    return sum;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    while(cin >> n){
        if(n < f(n)) cout << "盈數\n";
        else if(n > f(n)) cout << "虧數\n";
        else cout << "完全數\n";
    }
    return 0;
}

解法二、檢查到 sqrt(n)

窮舉 22 ~ n\sqrt{n} 之間所有的數
由於因數都是成對出現的
每找到一個因數,也會發現另一個 (n=a×bn = a \times b, a, b 都是 n 的因數)
特殊處理 完全平方數 (因數 n\sqrt{n} 會多算一次,減回去)

✅ 完整代碼

評分結果(參考) : AC (2ms, 320KB)

#include<bits/stdc++.h>
using namespace std;

int f(int num){
    int sum = 1;
    int sqrtNum = sqrt(num);
    
    for(int i=2; i<=sqrtNum; i++){
        if(num%i == 0) sum += i+num/i;
    }
    if(sqrtNum*sqrtNum == num) sum -= sqrtNum;
    
    return sum;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    while(cin >> n){
        if(n < f(n)) cout << "盈數\n";
        else if(n > f(n)) cout << "虧數\n";
        else cout << "完全數\n";
    }
    
    return 0;
}