除数计数总和给出了耗时的问题
divisors count sum gives time consuming issue
我想为给定的 n 写出 1,...,n 之间所有数字的除数,然后得出它们的个数和它们的总和。
例如:
对于 3:
1,1,2,1,3
输出为 5、8
我尝试获取 1,n 范围内的每个 j,然后使用以下代码计算除数的数量
但由于耗时,效率不高。
int count=0;
int sum=0;
for(int j=1,j<=n,j++){
for(int i=1,i<=j,i++){
if(j%i==0){
count+=1;
sum+=i;
}
}
}
这是一个著名的问题,所以之前应该有人问过。
不是得到每个数字然后找到它的除数,
您可以简单地计算出该范围内每个数字的倍数有多少。
即[n/i]。
所以 {1,...,n} 中的每个数字 i 出现 [n/i] 次。
剩下来计算它们的数量就是将其相加
范围内的所有 i 和 i*[n/i] 求和。
此代码可以满足您的需求:
而不是获取每个数字然后找到它的除数,
您可以简单地计算出该范围内每个数字的倍数有多少。
即 [n/i]。
所以 {1,...,n} 中的每个数字 i 出现 [n/i] 次。
剩下来计算它们的数量就是将其相加
范围内的所有 i 和 i*[n/i] 求和。
此代码可以满足您的需求:
int main(){
int n;
scanf("%d",&n);
int nums=0;
int sums=0;
for (int i=1; i<n+1;i++){
nums = nums + (n/i);
}
for (int i=1; i<n+1; i++){
sums = sums + (i* (n/i));
}
printf("%d %d",nums, sums);
}
我想为给定的 n 写出 1,...,n 之间所有数字的除数,然后得出它们的个数和它们的总和。 例如: 对于 3: 1,1,2,1,3 输出为 5、8 我尝试获取 1,n 范围内的每个 j,然后使用以下代码计算除数的数量 但由于耗时,效率不高。
int count=0;
int sum=0;
for(int j=1,j<=n,j++){
for(int i=1,i<=j,i++){
if(j%i==0){
count+=1;
sum+=i;
}
}
}
这是一个著名的问题,所以之前应该有人问过。 不是得到每个数字然后找到它的除数, 您可以简单地计算出该范围内每个数字的倍数有多少。
即[n/i]。 所以 {1,...,n} 中的每个数字 i 出现 [n/i] 次。 剩下来计算它们的数量就是将其相加 范围内的所有 i 和 i*[n/i] 求和。 此代码可以满足您的需求:
而不是获取每个数字然后找到它的除数, 您可以简单地计算出该范围内每个数字的倍数有多少。 即 [n/i]。 所以 {1,...,n} 中的每个数字 i 出现 [n/i] 次。 剩下来计算它们的数量就是将其相加 范围内的所有 i 和 i*[n/i] 求和。 此代码可以满足您的需求:
int main(){
int n;
scanf("%d",&n);
int nums=0;
int sums=0;
for (int i=1; i<n+1;i++){
nums = nums + (n/i);
}
for (int i=1; i<n+1; i++){
sums = sums + (i* (n/i));
}
printf("%d %d",nums, sums);
}