Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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 总和';s小于或等于N的数的除数之和_C_Algorithm_Optimization - Fatal编程技术网

C 总和';s小于或等于N的数的除数之和

C 总和';s小于或等于N的数的除数之和,c,algorithm,optimization,C,Algorithm,Optimization,在这个问题上,我确实需要一些帮助: 给定一个正整数N,我们将xsum(N)定义为小于或等于N的所有正整数除数之和 例如:xsum(6)=1+(1+2)+(1+3)+(1+2+4)+(1+5)+(1+2+3+6)=33。 (xsum-1的除数之和+2的除数之和+…+6的除数之和) 给定一个正整数K,要求您查找满足以下条件的最低N:xsum(N)>=K K是一个非零的自然数,最多有14位 时限:0.2秒 显然,在大多数情况下,如果超过时间限制,暴力就会下降。我还没有找到比它更好的东西,所以代码如下:

在这个问题上,我确实需要一些帮助:

给定一个正整数
N
,我们将
xsum(N)
定义为小于或等于
N
的所有正整数除数之和

例如:xsum(6)=1+(1+2)+(1+3)+(1+2+4)+(1+5)+(1+2+3+6)=33。
(xsum-1的除数之和+2的除数之和+…+6的除数之和)

给定一个正整数
K
,要求您查找满足以下条件的最低
N
xsum(N)>=K

K是一个非零的自然数,最多有14位

时限:0.2秒

显然,在大多数情况下,如果超过时间限制,暴力就会下降。我还没有找到比它更好的东西,所以代码如下:

fscanf(fi,"%lld",&k);
i=2;
sum=1;
while(sum<k) {
    sum=sum+i+1;
    d=2;
    while(d*d<=i) {
          if(i%d==0 && d*d!=i)
             sum=sum+d+i/d;
          else
             if(d*d==i)
                 sum+=d;
           d++;
    }
    i++;
}
fscanf(fi、%lld、&k);
i=2;
总和=1;

对于[1,n]范围内的每一个
n
数字,
n
是[1,n]范围内精确的
roundDown(n/n)
数字的除数。因此,对于每一个
n
,我们在结果中加上一个
n*roundDown(n/n)

int xsum(int N){
    int result = 0;

    for(int i = 1 ; i <= N ; i++)
        result += (N / i) * i;//due to the int-division the two i don't cancel out

    return result;
}

14位意味着14位?或十进制数字?无论如何。这个问题是离题的。code rview网站也不是。如果你的代码有效,试一下。但首先阅读他们的常见问题解答(你显然没有读过这篇文章)!14位小数。我的代码是有效的,我之所以这样做是因为我阅读了规则,你必须展示你的工作,你尝试做什么等。谢谢,我必须承认我没有听说过Atkin的筛。在试图理解这个解决方案之前,我必须记录。@scummy如果性能没有那么重要,你可以简单地将Erathostenes的筛用作这就是我要说的,我刚刚考虑了整个问题,实际上有一个更简单的解决方案,我会edit@scummy我用更简单的(线性)解决方案更新了答案
int N(int K){
    //start with the minimum-bound of N
    int upperN = (int) sqrt(K);
    int lowerN = upperN;

    int tmpSum;
    //search until xsum(upperN) reaches K
    while((tmpSum = xsum(upperN)) < K){
        int r = K - tmpSum;

        lowerN = upperN;
        upperN += (int) sqrt(r / 3) + 1;
    }

    //Now the we have an upper and a lower bound for searching N
    //the rest of the search can be done using binary-search (i won't
    //implement it here)

    int N;//search for the value

    return N;
}