Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
3年前关闭。
问题陈述:
查找N以下3或5的所有倍数的总和。
输入格式:
第一行包含T,它表示测试用例的数量。随后是T行,每行包含一个整数N。
限制条件:
1
1
输出格式:
对于每个测试用例,请打印一个整数,该整数表示N以下3或5的所有倍数的和。
这是我的代码:
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
3年前关闭。
问题陈述:
查找N以下3或5的所有倍数的总和。
输入格式:
第一行包含T,它表示测试用例的数量。随后是T行,每行包含一个整数N。
限制条件:
1
1
输出格式:
对于每个测试用例,请打印一个整数,该整数表示N以下3或5的所有倍数的和。
这是我的代码:
#include <stdio.h>
int main() {
long t,i,x;
scanf("%ld",&t);
long y[t];
for(i=0; i<t; i++) {
scanf("%ld",&x);
long j,k,sum= 0;
if(x<=3)
sum= 0;
else if(x<=5)
sum= 3;
else {
for(j=3; j<x; j+=3)
sum= sum + j;
for(j=5; j<x; j+=5)
if(j%3!=0)
sum = sum + j;
}
y[i] = sum;
}
for(i=0; i<t; i++) {
printf("%ld\n",y[i]);
}
return 0;
}
最佳答案
有一个时间复杂度为O(T)的解决方案:
将公式用于整数1+2+3+...+n = n*(n+1)/2
。
另请注意,3+6+9+...+(3*n) = 3*(1+2+3+...+n) = 3*n*(n+1)/2
。
找出有多少个数字可被3整除。计算它们的总和。
找出有多少个数字可被5整除。计算它们的总和。
找出有多少个数字可以除以15(= 3 * 5)。计算它们的总和。
总和为sum3 + sum5 - sum15
。被3和5整除的数字(因此被15整除)在sum3和sum5中,因此,除非我们减去sum15,否则它们将被计数两次。
请注意,总和将溢出32位整数,因此请确保使用64位整数类型。
10-07 13:58