问题标题: 酷町堂:6929 勾股定理

0
0
已解决
王文博
王文博
缔造者之神
缔造者之神

这道题我用的是暴力枚举,结果可想而知

暴力枚举,三层循环,不超时就怪

我的代码时间复杂度到了O(n的3次方)

最大为10000,那么n的3次方为10^12,远远超过10^8.

所以我想知道更好的方法。谁能帮我一下?谢谢!


0
已采纳
汪宇航
汪宇航
新手启示者
新手启示者

此题用双重循环i和j

i:1~n

j:i+1~n

在双重循环里定义一个k:

int  k=sqrt(i*i+j*j);

最后if:

if(k*k==i*i+j*j&&k<=n){

    cout<<i<<' '<<j<<' '<<k<<endl;

}

当然,因为没有输出No

所一在循环外定义一个bool x;

然后在循环中的if里的输出加一个:

x=1;

也就是:

if(k*k==i*i+j*j){

    cout<<i<<' '<<j<<' '<<k;

    x=1;

}

懂了吗?

不懂得话给你双重循环:

最后if(!y)cout<<"No";

注意:要加#pragma GCC optimize(3)!否则会超时!

0
周琪岳
周琪岳
资深光能
资深光能

三种:

1)打表 同意杜承俊

2)双重循环+sqrt+O(3)+死卡常(快读+快写+registerint+...)

3)双重循环+根号预处理,由于sqrt开销极大,可以用桶数组解决(没试过,但应该能过)

0
我要回答