開啟章節選單

11728 Alternate Task

題目連結

題目敘述

Hasan 喜歡和朋友們玩數字遊戲。 有一天,他們玩一個遊戲:其中一人說出一個正整數,其餘的人必須說出這個數字的所有因數的總和。 第一個正確說出來的人獲勝。

他們覺得這個遊戲有點無聊,想試試不同的玩法。 Hasan 建議嘗試反過來玩這個遊戲。 也就是說,給定一個正整數 S,他們要找出一個數字,其所有因數的總和是 S。

他們意識到這個任務比原來的遊戲難多了,於是 Hasan 向你求助。 幸運的是,Hasan 擁有一個可攜式可編程的裝置,你決定為這個裝置寫一個程式。 給定一個數值 S 作為程式輸入,程式將輸出一個其因數總和等於 S 的數字。

輸入格式

每組輸入由一個正整數 S 組成 (S ≤ 1000)。 最後一組輸入是一個數值 0,表示輸入結束。

輸出格式

對於輸入的每個 S,輸出一行結果。 輸出一個正整數,其因數的總和等於 S。 若有多個這樣的數字,輸出其中最大的那個。 若沒有符合條件的數字,輸出 -1。

解題思路

fsum 回傳所有因數和,因為要找最大的 i,我們可以從 i = 1000 倒著往下找,直到找到第一個 fsum(i) == N 的數,若 i == 1 輸出 -1 代表沒有符合條件的數字。

程式碼

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

int fsum(int a) {
    int s = 0;
    for (int i = 1; i * i <= a; i++) {
        if (a % i == 0) {
            s += i;
            if (i != a / i) {
                s += a / i;
            }
        }
    }
    return s;
}

int main() {
    int n, c = 0;
    while(cin >> n && n) {
        c++;
        for (int i = n; i >= 1; i--) {
            if (fsum(i) == n) {
                cout << "Case " << c << ": " << i << "\n";
                break;
            }
            if (i == 1){
                cout << "Case " << c << ": " << -1 << "\n";
            }
        }
    }
}