C語言求勾股數程式碼及解析
問題描述
求150以內的所有勾股數。
所謂勾股數,是指能夠構成直角三角形三條邊的三個正整數(a,b,c)。
問題分析
根據“勾股數”定義,所求三角形三邊應滿足條件 a2 + b2 = c2。可以在所求範圍內利用窮舉法找出滿足條件的數。
演算法分析
採用窮舉法求解時,最容易想到的一種方法是利用3個迴圈語句分別控制變最a、b、c的取值範圍,第1層控制變數a,取值範圍是1〜100。在a值確定的情況下再確定b值,即第2層控制變數b,為了避免結果有重複現象,b的取值範圍是a+1〜150。a、b的值已確定,利用窮舉法在b+1〜150範圍內一個一個的去比較,看當前c值是否滿足條件 a2 + b2 = c2
//...
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("150以內的勾股數有:\n");
printf(" a b c a b c a b c a b c\n");
/*求150以內勾股數*/
for(a=1; a<=150; a++)
for(b=a+1; b<=150; 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<=150) /*判斷c的平方是否等於a2+b2*/
{
printf("%4d %4d %4d ", a, b, c);
count++;
if(count%4==0) /*每輸出4組解就換行*/
printf("\n");
}
}
printf("\n");
return 0;
}
執行結果:
150以內的勾股數有:
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 15 112 113
16 30 34 16 63 65 17 144 145 18 24 30
18 80 82 20 21 29 20 48 52 20 99 101
21 28 35 21 72 75 22 120 122 24 32 40
24 45 51 24 70 74 24 143 145 25 60 65
27 36 45 27 120 123 28 45 53 28 96 100
30 40 50 30 72 78 32 60 68 32 126 130
33 44 55 33 56 65 35 84 91 35 120 125
36 48 60 36 77 85 36 105 111 39 52 65
39 80 89 40 42 58 40 75 85 40 96 104
42 56 70 42 144 150 44 117 125 45 60 75
45 108 117 48 55 73 48 64 80 48 90 102
48 140 148 50 120 130 51 68 85 51 140 149
54 72 90 55 132 143 56 90 106 56 105 119
57 76 95 60 63 87 60 80 100 60 91 109
63 84 105 64 120 136 65 72 97 66 88 110
66 112 130 69 92 115 72 96 120 75 100 125
78 104 130 80 84 116 81 108 135 84 112 140
87 116 145 88 105 137 90 120 150 96 110 146
100 105 145