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