oj之路(第二天)(由題目看思想)

接下來這道題目用稱爲”暴力法“的思想來解決,目前我對”暴力法“的認識還處於初級階段,可能是對暴力法能使用的判斷條件還不是很明白安靜

=========================================================================================================

題目描述:

著名的數學家畢達哥拉斯可能從來都不曾想過有人居然會問他這樣的一個問題:給出一個整數,存在多少個直角三角形,它的某一條邊的長度等於這個整數,而且其他邊的長度也是整數。既然畢達哥拉斯不可能預見到有計算機的出現,如果他回答不出來,那誰又能責怪他呢?但是現在既然你有了計算機,那麼回答不出來就說不過去了。
輸入格式
第一行有一個整數n,代表有多少個數據(1<=n<=20)。接下來有n行,每行代表一個數據。一個數據就是一個整數ai(a<=i<=n,1<=ai<=100)。
輸出格式
每個數據都必須有相應的輸出。兩個數據的輸出之間有一個空行。最後一個測試數據的輸出後不要加空行。
對於每一個數據,如果找不到解,則輸出一個空行。如果找到解,就把符合條件的所有直角三角形輸出。每個三角形佔一行,輸出該三角形的另外兩條邊,必須先輸出長邊,然後一個逗號,再輸出短邊。兩個三角形之間不能有空行,而且必須按照長邊降序排列。
輸入樣例
2
20
12
輸出樣例
101,99
52,48
29,21
25,15
16,12


37,35
20,16
15,9
13,5

=========================================================================================================

思考過程:
已知一條邊,對於直角三角形的成立其實有個隱含的條件,那就是當另外兩條邊大到一定程度的時候,無論如何也不可能形成直角三角形。
這個值可通過如此計算出來:
x²-(x-1)²> 已知邊²
所以接下來的所有情況我們可以全部列出來--”暴力法”的使用條件之一。
對於暴力法,另外的使用條件就是要滿足所有的情況不能太多,要不然對於題目來說會超時。

=========================================================================================================

源代碼:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
bool isRight(int m, int n)//判斷第三條邊是否可以滿足直角三角形的條件
{
	int tmp = sqrt(abs((double)m*m - n*n));
	return tmp == sqrt(abs((double)m*m - n*n)) && tmp != 0;
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--) {
		int n;
		scanf("%d", &n);
		for (int i = ( n * n + 1 ) / 2; i >= 1; --i) {
			if (isRight(i, n) && i >= (int)sqrt(abs((double)i*i - n*n))) {
				printf("%d,%d\n", i, (int)sqrt(abs((double)i*i - n*n)));
			}
		}
		if (t != 0)
			printf("\n");
	}
	return 0;
}

=========================================================================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章