Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过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