Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 小于或等于n的所有富足数之和_C++_Optimization_Mathematical Optimization - Fatal编程技术网

C++ 小于或等于n的所有富足数之和

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;

问题是找到小于或等于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;

        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);