1. 程式人生 > >C語言求勾股數程式碼及解析

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

,若滿足,則輸出當前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("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

C語言求勾股數程式碼及解析