華爲筆試:直角三角形個數

題目描述:ios

給定三角形周長p,求知足邊長爲整數且周長爲p的直角三角形個數。優化

 

思路分析:spa

枚舉的思想。首先想到就是利用一個雙重循環:code

for(int i=1; i<p; i++)
{
    for(int j=i; j<p; j++)
    {
        int k = p-i-j;
        if(i*i+j*j==k*k)
            ans++;
    }
}

但這樣是會超時的,經過數學方式作分析:blog

i+j+k=p, 0<i<=j<k, 經過解不等式,能夠獲得:i<p/3, j<p/2。ci

在雙重循環的基礎上,作限制,可以經過,但仍能夠進一步優化。數學

 

一重循環:it

考慮兩個方程:io

i+j+k=p, i^2+j^2 = k^2。class

j = p-p^2/(2p-2i)。

 

代碼:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<vector>
 4 using namespace std;
 5 
 6 int main(){
 7     int p;
 8     cin>>p;
 9     int ans=0;
10     for(int i=1; i<p/3; i++)
11     {
12         double j=p-(double)p*p/(2*p-2*i);
13         if(i<j && j-(int)j<1e-5)
14         {
15             ans++;
16         }
17     }
18     cout<<ans<<endl;
19     return 0;
20     
21 }
相關文章
相關標籤/搜索