检查数字是否可以表示为C ++中两个丰富的数字的和
假设我们有一个数字。我们必须将其表示为两个大量数字的和,如果是,则打印数字,否则打印-1。一个数字被认为是一个充裕的数字,它是该数字的所有适当除数的总和,由sum(n)表示大于数字的值。
为了解决这个问题,我们将所有丰富的数字存储到集合中,对于给定的数字n,对i=1到n进行循环,并检查n和(n–i)是否丰富。
示例
#include <iostream>
#include <set>
#define N 100005
using namespace std;
set<int> getAbundantSet() {
set<int> abundant_set;
for (int i = 1; i < N; i++) {
int sum = 1;
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
sum += j;
if (i / j != j)
sum += i / j;
}
}
if (sum > i)
abundant_set.insert(i);
}
return abundant_set;
}
void representSumAbundant(int number){
set<int> abundant_set = getAbundantSet();
for (int i = 1; i <= number; i++) {
if (abundant_set.count(i) && abundant_set.count(number - i)) {
cout << i << " " << number - i;
return;
}
}
cout << -1;
}
int main() {
int n = 30;
representSumAbundant(n);
}输出结果
12 18