SP12304

发布时间 2023-11-15 19:38:28作者: To_Carpe_Diem

题目传送门

简述题目:

题目要求找出满足条件 \(σ(i) = n\)最小整数 \(i\),其中 \(σ(i)\) 表示 \(i\) 的所有正因子的和。

解题思路:

  • 首先定义一个函数 \(Suum(i)\),用于计算 \(i\) 的所有正因子的和。在函数内部,使用一个循环遍历 \(i\)所有可能因子。对于每一个因子 \(i\),如果 \(i\) 能够整除 \(n\),那么将 \(i\) 加到用来存储的 \(sum\) 上,并将 \(n\) 除以 \(i\) 得到的商加到 \(sum\) 上。注意:除数和被除数不能相同
  • 接下来定义一个函数 \(minsum(n)\),用于找到满足条件的最小整数 \(i\)。初始化 \(i\)\(1\),然后进行如下步骤:
  1. 检查 \(Suum(i)\) 是否等于 \(n\),如果相等,则返回当前的 \(i\)
  2. 如果 \(i\) 大于 \(n\),说明没有满足条件的 \(i\),跳出循环。
  3. 否则,\(i\) 自增 \(1\),继续下一轮循环。

主要知识:

这个题目主要用到了数学知识中的因子和的概念,以及循环条件语句的使用。

Code:

#include <iostream>
using namespace std;

int Suum(long long n) {
    long long sum = 0;
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            sum += i;
            if (i != (n/i)) {
                sum += (n/i);
            }
        }
    }
    return sum;
}

int minsum(long long n) {
    long long i = 1;
    while (true) {
        if (Suum(i) == n) {
            return i;
        }
        if (i > n) {
            break;
        }
        i++;
    }
    return -1;
}

int main() {
    int T;
    cin >> T;
    
    while (T--) {
        long long n;
        cin >> n;
        
        long long ans = minsum(n);
        cout << ans << endl;
    }
    
    return 0;
}