勾股數專題-SCAU-1079 三角形-18203 神奇的勾股數(原創)
阿新 • • 發佈:2019-11-27
勾股數專題-SCAU-1079 三角形-18203 神奇的勾股數(原創)
大部分的勾股數的題目很多人都是用for來便利,然後判斷是不是平方數什麼什麼的,這樣做的時候要對變數型別和很多細節都是要掌握好的,但是有沒有一種方法就是輸入一個數然後用數學的方法就可以吧答案(也就是另外兩個勾股數求出來的方法了)
我基於勾股定理和一個重要的定理(就是加入最小邊是奇數的話,長邊和中邊的差是1,如果最小邊是偶數的話,那麼長邊和中邊的差就是2的,然後利用這個性質和勾股定理,通過方程聯立)
例題18203 神奇的勾股數
該題有題解
時間限制:1000MS 記憶體限制:65535K
提交次數:0 通過次數:0
題型: 程式設計題 語言: 不限定
Description
給你一個正整數n,問有沒有一個直角三角形,它所有的邊長都是正整數,而且n是它的最小邊長。
輸入格式
(單case) 一個數n(1 ≤ n ≤ 10000)。
輸出格式
如果沒有這樣的直角三角形,輸出“NO”(不包括雙引號); 如果有,輸出兩個數,第一個數是另一條直角邊邊長,第二個數是斜邊邊長。 (確保只有一個答案)
輸入樣例
3
輸出樣例
4 5
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int a; 7 scanf("%d",&a); 8 int b,c; 9 if(a==1||a==2) 10 printf("NO"); 11 else if(a%2==0)//判斷奇偶 12 { 13 b=a*a/4-1;//直接用數學公式法 14 c=a*a/4+1; 15 if(a<b&&a<c) 16 printf("%d %d",b,c); 17 else 18 printf("NO"); 19 } 20 else if(a%2!=0) 21 { 22 b=(a*a-1)/2; 23 c=(a*a+1)/2; 24 if(a<b&&a<c) 25 printf("%d %d",b,c); 26 27 else 28 printf("NO"); 29 } 30 // printf("%d %d",b,c); 31 return 0; 32 }
也就是說如果我們知道了最小邊的話就可以不用for就直接用數學的公式就可以吧中邊和大邊給求出來了,那麼加入最小邊是不知道的,知道中邊或者是長邊的任意一個的話,該怎麼求呢,
就基於上面的分析,我們還是利用了那個性質和勾股定理也是可以用數學公式發來吧其他邊算出來的
如圖:
思路:下面這道題目就是上面那個題目的進階版了,因為它是要算出輸入的x是短邊中邊長邊的三種情況的
例題1079 三角形
時間限制:500MS 記憶體限制:65536K
提交次數:283 通過次數:82
題型: 程式設計題 語言: G++;GCC
Description
著名的數學家畢達哥拉斯可能從來都不曾想過有人居然會問他這樣的一個問題:給出一個整數,存在多少個直角三角形, 它的某一條邊的長度等於這個整數,而且其他邊的長度也是整數。既然畢達哥拉斯不可能預見到有計算機的出現, 如果他回答不出來,那誰又能責怪他呢?但是現在既然你有了計算機,那麼回答不出來就說不過去了。
輸入格式
第一行有一個整數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
程式碼:(待完善,我優化一下)