1. 程式人生 > >C語言經典例題(一)

C語言經典例題(一)

1.需求描述:
一輛卡車違反交通規則,撞人後逃跑。現場有三人目擊該事件,但都沒有記住車牌號,只記下車牌號的一些特徵。甲說:牌照前兩位數字是相同的;乙說:牌照的後兩位數字是相同的,但與前兩位不同;丙是數學家,他說:四位的車牌號剛好是一個整數的平方。請根據以上線索求出車牌號。
2.問題分析:
首先可以確定車牌號只由2個數字組成,第一、二位相同,第三、四位相同,並且車牌號組成的數是一個整數的平方。從這裡就可以看出此程式有兩個for語句巢狀迴圈,在迴圈中還存在著一個判斷,由於還要判斷是否為一個整數的平方,所以還要再加一層迴圈。
3.完整程式

#include <stdio.h>
int main() { int a; int c; int num; int temp; for(a = 0; a <= 9; a++) { for(c = 0; c <= 9; c++) { if(a !=c)      {      num = 1000 * a + 100 * a + 10 * c + c;      for(temp = 0; temp <=99; temp++)      {      if
(temp * temp == num)         {          printf("the plate number is :%d\n",num);         }      }      } } } return 0; }

輸出結果
linux中用gcc編譯的結果
程式優化:
進一步的分析可以看出第一、二位為大於0的數,所以第一層迴圈可以從1開始,因為這個車牌表示的四位數第一、二位不為0,所以該車牌一定大於1100而小於9999,所以那個整數一定大於33並且小於100,所以迴圈次數可以進一步減少,通過修改迴圈條件的初始值我們可以提高程式碼的執行速率。
優化程式碼:

#include <stdio.h>

int main()
{
   int a;
   int c;
   int num;
   int temp;

   for(a = 1; a <= 9; a++)
   {
       for(c = 0; c <= 9; c++)
       {
           if(a !=c)
          {
               num = 1000 * a + 100 * a + 10 * c + c;
               for(temp = 33; temp <=99; temp++)
               {
                   if(temp * temp == num)
                   {
                       printf("the plate number is :%d\n",num);
                   }
               }
           }
        }
   }   
   return 0;
}

但是程式還存在著不足,因為車牌號應該是唯一的,所以最佳的程式應該是一旦找到該車牌號就立即停止尋找,直接輸出。