请问这个为什么会超时?

img

img


#include<stdio.h>
#include<math.h>
int main() {
int n, i, x, y,a,b;
i = 0;
scanf("%d", &n);
a = n / 2;
b = sqrt(n);
for (x = 1; x <= a; x++) {
for (y = 1; y <= b; y++) {
if (2*x + pow(y, 2) == n) i++;
}
}
printf("%d\n", i);
return 0;
}

为什么不会超时呢?n是10^18,你外层循环都超时了


#include <math.h>
#include <stdio.h>
int main() {
    long long n,y,num,i=0;
    scanf("%lld", &n);
    num = sqrt(n - 2);
    for (y = 1; y <= num; y++)
        if ((n - y) % 2 == 0)
            i++;
    printf("%lld\n", i);
    return 0;
}

img


n最大是10的18次方,这个数你放循环的条件判断处,十之八九都会超时,时间复杂度太高了。
a=n / 2 也就是最大可以是 5 乘以 10的17次方,再算上b的10的9次,基本上就是超时。

希望对题主有所帮助!可以的话,帮忙点个采纳!

pow(y, 2) 修改成 y*y 这样会减少 调用pow函数带来的额外耗时

这样呢


#include<stdio.h>
int main() {
int n, i, x, y,a,b;
i = 0;
scanf("%d", &n);
for (x = 1; 2*x <= n; x++) {
for (y = 1; y*y <= n; y++) {
if (2*x + y*y == n) i++;
}
}
printf("%d\n", i);
return 0;
}

试试单层循环呢(循环y,算(n-y2)/2是不是整数)

这个试试

#include<stdio.h>
int main() {
long long n, i, x, y,a,b;
i = 0;
scanf("%lld", &n);
long long t1=n*2,t2=n*n;
for (x = 1; x <= t1; x++) {
for (y = 1; y <= t2; y++) {
if (2*x + y*y == n) i++;
}
}
printf("%lld\n", i);
return 0;
}