C++ 小于或等于n的所有富足数之和
问题是找到小于或等于n的所有富足数之和,其中富足数是所有适当因子之和大于该数的数,例如12是富足数,如C++ 小于或等于n的所有富足数之和,c++,optimization,mathematical-optimization,C++,Optimization,Mathematical Optimization,问题是找到小于或等于n的所有富足数之和,其中富足数是所有适当因子之和大于该数的数,例如12是富足数,如 1+2+3+4+6=16,大于12 这是我的实现,我得到了TLE,我被困在这里,似乎找不到任何办法。 请帮忙 int isAbundant(int n){ int sum = 0; for (int i=1; i<=sqrt(n); i++){ if (n%i==0){ if (n/i == i) sum = sum + i;
1+2+3+4+6=16,大于12 这是我的实现,我得到了TLE,我被困在这里,似乎找不到任何办法。 请帮忙
int isAbundant(int n){
int sum = 0;
for (int i=1; i<=sqrt(n); i++){
if (n%i==0){
if (n/i == i)
sum = sum + i;
else{
sum = sum + i;
sum = sum + (n / i);
}
}
}
if(sum - n > n) return 1;
else return 0;
}
int find_abundant_numbers(int n1) {
set<int> s;
if(n1 < 12) return 0;
for(int i = 12; i <= n1; i++){
if(i % 2 != 0 && i < 945){
continue;
}
if(s.find(i) == s.end()){
int isA = isAbundant(i);
if(isA){
for(int j = 1; j * i <= n1; j++){
s.insert(i * j);
}
}
}
else{
continue;
}
//if(isA) cout << isA << " ";
}
return accumulate(s.begin(), s.end(), 0);
}
int isAbundant(int n){
整数和=0;
对于(int i=1;in)返回1;
否则返回0;
}
整数查找数(整数n1){
设置s;
如果(n1<12)返回0;
对于(int i=12;i你的问题是找到小于n的大量数的集合,而不是检查一个特定数是否丰富。例如,埃拉托斯提尼筛,一种古老的算法,用于查找所有小于给定数的素数。它不逐个检查一个数是否是素数,但在更高的级别上,在一系列数字上,k更有效
我们的想法是让数组std::vector sum(n+1);
(最初所有值都设置为0)递增填充,直到我们获得所有数字所需的严格除数之和。给定一个值(除数),子流程是通过将此值添加到表示可被其整除的数字的sum
中的所有元素来更新数组sum
:
如果您想获得有关富足数字概念的帮助,请查看其维基百科文章,这是一个数学概念,因此某些属性可以利用。我也尝试过这样做,但无法突破时间障碍。我从未听说过TLE,那是什么?@Dominique:“超过时间限制”/“执行时间过长”,这是来自富有挑战性的网站。关于代码优化的问题,不是针对codereview.stackExchange.com网站而不是此处吗?
auto propagate_divisor = [&](int divisor) {
for (int i = 2 * divisor; i <= n; i += divisor)
sum[i] += divisor;
};
for (int i = 1; i <= n; ++i)
propagate_divisor(i);
for (int i = 0; i <= n; ++i)
if (sum[i] > i)
printf("%i ", i);