zoukankan      html  css  js  c++  java
  • 华为笔试:直角三角形个数

    题目描述:

    给定三角形周长p,求满足边长为整数且周长为p的直角三角形个数。

    思路分析:

    枚举的思想。首先想到就是利用一个双重循环:

    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++;
        }
    }

    但这样是会超时的,通过数学方式做分析:

    i+j+k=p, 0<i<=j<k, 通过解不等式,可以得到:i<p/3, j<p/2。

    在双重循环的基础上,做限制,能够通过,但仍可以进一步优化。

    一重循环:

    考虑两个方程:

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

    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 }
  • 相关阅读:
    图书-哲学-奥卡姆剃刀:《奥卡姆剃刀原理》
    汉语-词语-认知:认知能力
    汉语-词语-认知:认知水平
    汉语-词语:认知
    pg_dump
    pg_ctl
    pg_controldata
    pg_config
    paste
    passwd
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11426849.html
Copyright © 2011-2022 走看看