gpt4 book ai didi

c - 我怎样才能降低这段代码的复杂性(如下所示)?

转载 作者:行者123 更新时间:2023-11-30 21:43:35 24 4
gpt4 key购买 nike

问题陈述: 求 N 以下所有 3 或 5 的倍数之和。

输入格式:第一行包含 T 表示测试用例的数量。接下来是 T 行,每行包含一个整数 N。

约束:

1 <= T <= 10^5

1 <= N <= 10^9

输出格式:对于每个测试用例,打印一个整数,表示 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 位整数类型。

关于c - 我怎样才能降低这段代码的复杂性(如下所示)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com