鍍金池/ 問答/人工智能  C  C++  HTML/ C語言已知內(nèi)切圓半徑求直角三角形的三條邊長

C語言已知內(nèi)切圓半徑求直角三角形的三條邊長

#include<stdio.h>
#include<math.h>
void solve(int r) 
{
    for(int a =2*r;a <80; a ++)
    {
        for(int b = a;b < 900; b++)
         {
            int c=a*a+b*b;
            if( fabs( sqrt(c) - (int) sqrt(c) ) < 1e-8)
            {
                if(r == (a+b-sqrt(c)) /2)
                 {
                    printf("%d,%d,%d\n",a,b,(int)sqrt(c));
                }
            }
        }
    }
    printf("\n");
}

三條直角邊要求是整數(shù)。我這樣寫可以得到答案,可是循環(huán)次數(shù)太多了,請問要怎么寫可以循環(huán)次數(shù)不那么多

回答
編輯回答
愿如初

你這樣怎么就能得到答案了?難道直角邊一定是整數(shù)嗎?

———— update

你的程序沒有大問題,屬于一般常用解法。如果要優(yōu)化的話,可以從兩個方面來考慮:

如果只需要找到一個答案,可在找到之后及時跳出循環(huán)。

在a已確定的情況下,最多只有一個解,此時內(nèi)層循環(huán)可以用二分法來加速。

2017年10月12日 15:44
編輯回答
雨萌萌

這道題的答案應該是這樣, 我給你說一下思路

首先這個問題只需要一次循環(huán)就能得出答案

因為已知內(nèi)切圓半徑和三角形是直角這兩個信息, 這時候設其中一條直角邊長度為X 另一條直角邊的長度是不是就已經(jīng)確定了?

然后就是思考, 這個循環(huán)的范圍, 因為內(nèi)切圓的長度是2r, 所以X 至少是2r+1 循環(huán)到什么時候結束呢

當X 慢慢變長 三角形會慢慢接近 等腰之間三角形 此時邊長為D, 只需循環(huán)X<=D 就行了,

接下來證明, 因為假設X>D 存在一個整數(shù) X1, 使得另一個直角邊也是整數(shù)為 X2, 那X2 必然小于D,

因為在三角形為等腰直角三角形的時候, 另一條直角邊為D , X再增加 另一條邊會慢慢變短

所以這個 X1,X2 這個解 會在 X=X2 的時候就被找到

思路有了后代碼其實很簡單, 主要工作量都在根據(jù)X算出另一條邊上, 這個在紙上列個方程, 寫進去就行

我寫個偽代碼, 半徑為r 內(nèi)切圓的等腰直角三角形的邊為 2r+√2r

for(int x = 2*r+1 ; x <= 2r+√2r ; x++){
    x2 = f(x,r) //解方程計算另一條邊
    if(x2 為整數(shù)){
        printf("%d %d",x,x2)
    }
}

沒有則說明無解

2017年9月9日 12:36