題目描述: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 }