C語言求勾股數
問題描述
求100以內的所有勾股數。
所謂勾股數,是指能夠構成直角三角形三條邊的三個正整數(a,b,c)。
問題分析
根據“勾股數”定義,所求三角形三邊應滿足條件 a2 + b2 = c2。可以在所求范圍內利用窮舉法找出滿足條件的數。
算法分析
采用窮舉法求解時,最容易想到的一種方法是利用3個循環語句分別控制變最a、b、c的取值范圍,第1層控制變量a,取值范圍是1〜100。在a值確定的情況下再確定b值,即第2層控制變量b,為了避免結果有重復現象,b的取值范圍是a+1〜100。a、b的值已確定,利用窮舉法在b+1〜100范圍內一個一個的去比較,看當前c值是否滿足條件 a2 + b2 = c2,若滿足,則輸出當前a、b、c的值,否則繼續尋找。主要代碼如下:
//...
for(a=l; a<=100; a++) /*確定a的取值*/
for(b=a+l; b<=100; b++) /*確定b的取值*/
for(c=b+l; c<=100; c++) /*確定c的取值*/
if(a*a+b*b==c*c)
printf ("%d\t%d\t%d\n", a, b, c) /*判斷三個變量是否滿足勾股數條件*/
//...
但是上述算法的效率比較低,根據 a2 + b2 = c2 這個條件,在a、b值確定的情況下,沒必要再利用循環一個一個去尋找c值。若a、b、c是一組勾股數,則 a2 + b2 的平方根一定等于c,c的平方應該等于a、b的平方和,所以可將的平方根賦給c,再判斷c的平方是否等于。根據“勾股數”定義將變量定義為整型,a2 + b2 的平方根不一定為整數, 但變量c的類型為整型,將一個實數賦給一個整型變量時,可將實數強制轉換為整型(舍棄小數點之后的部分)然后再賦值,這種情況下得到的c的平方與原來的的值肯定不相等,所以可利用這一條件進行判斷。
下面是完整的代碼:
#include<stdio.h>
#include<math.h>
int main()
{
int a, b, c, count=0;
printf("100以內的勾股數有:\n");
printf(" a b c a b c a b c a b c\n");
/*求100以內勾股數*/
for(a=1; a<=100; a++)
for(b=a+1; b<=100; b++)
{
c=(int)sqrt(a*a+b*b); /*求c值*/
if(c*c==a*a+b*b && a+b>c && a+c>b && b+c>a && c<=100) /*判斷c的平方是否等于a2+b2*/
{
printf("%4d %4d %4d ", a, b, c);
count++;
if(count%4==0) /*每輸出4組解就換行*/
printf("\n");
}
}
printf("\n");
return 0;
}</math.h></stdio.h>
運行結果:
100以內的勾股數有:
a b c a b c a b c a b c
3 4 5 5 12 13 6 8 10 7 24 25
8 15 17 9 12 15 9 40 41 10 24 26
11 60 61 12 16 20 12 35 37 13 84 85
14 48 50 15 20 25 15 36 39 16 30 34
16 63 65 18 24 30 18 80 82 20 21 29
20 48 52 21 28 35 21 72 75 24 32 40
24 45 51 24 70 74 25 60 65 27 36 45
28 45 53 28 96 100 30 40 50 30 72 78
32 60 68 33 44 55 33 56 65 35 84 91
36 48 60 36 77 85 39 52 65 39 80 89
40 42 58 40 75 85 42 56 70 45 60 75
48 55 73 48 64 80 51 68 85 54 72 90
57 76 95 60 63 87 60 80 100 65 72 97
- C語言求最大公約數
- 如果有一個自然數a能被自然數b整除,則稱a為b的倍數,b為a的約數。幾個自然數公有的約數,叫做這幾個自然數的公約數。
- 03-12 關注:0
- C語言求勾股數
- 所謂勾股數,是指能夠構成直角三角形三條邊的三個正整數(a,b,c)。
- 03-11 關注:3
- C語言求回文數
- 將數組中元素重新組合成一新數。拆分時變量a的最高位仍然存儲在數組中下標最大的位置
- 03-11 關注:3
- C語言水仙花數
- 輸出所有的“水仙花數”,所謂的“水仙花數”是指一個三位數其各位數字的立方和等于該數本身,例如153是“水仙花數”,因為:153 = 13
- 03-11 關注:3
- C語言求自守數
- 自守數是指一個數的平方的尾數等于該數自身的自然數。
- 03-11 關注:2
- C語言求親密數
- 如果整數A的全部因子(包括1,不包括A本身)之和等于B;且整數B的全部因子(包括1,不包括B本身)之和等于A
- 03-11 關注:2
- C語言求完數(完全數)
- 如果一個數等于它的因子之和,則稱該數為“完數”(或“完全數”)。例如,6的因子為1、2、3,而 6=1+2+3,因此6是“完數”。
- 03-11 關注:3