經典算法——韓信點兵問題的簡單算法

        搞開發的人都需要積累一些經典算法,以備不時之須。

        搞開發也有好幾年了,積累的一些算法一直沒做過整理,這段時間無聊就把這些算法整理以下,以備以後之用。

        本文是關於階梯的一個算法,用到了剩餘定理算法,分享下:

        愛因斯坦曾出過這樣一道有趣的數學題,有一個長階梯,每步上2階,最後剩1階;若每步上3階,最後剩2階,若每步上5階,後剩4階;若每步上6階,最後剩5階;只有每步上7階,最後一階也不剩。問至少有多少階階梯?

        這個是我國古代的韓信點兵問題:古人用剩餘定理口算或心算,有計算機以後,可以由計算機幫忙解決了,算法很簡單(JAVA實現):
        package com.jack.arithmetic;

/**
 * 韓信點兵算法
 * @author jack
 * @date  2010/08/06
 */
public class Ladder {

 public static void main(String[] args) {
  int count = 0;
  while(count>=0){
   if ((count % 2 == 1) && count % 3 == 2 && count % 5 == 4 && count % 6 == 5
     && count % 7 == 0) {
    System.out.print("這個數字是:" + count);
    break;
   }else{
    count++;    
   }
  }
 }
}
注:因爲並沒有告訴你會有多少階梯,所以此處使用while循環進行處理,當出現滿足所有條件的數時,顯示此數,並結束循環;否則每次對count進行加加操作。
其實細想一下,能夠被7整除,說明這個數一定是7的倍數,下面再改進一下算法:
int count = 0;
  while(count>=0){
   if ((count % 2 == 1) && count % 3 == 2 && count % 5 == 4 && count % 6 == 5
     && count % 7 == 0) {
    System.out.print("這個數字是:" + count);
    break;
   }else{
    count += 7;
   }
  }

注意:7是奇數卻可以被整除,故結果一定是7的整數倍:

int c = 7;
  while(c>=0){
   if (c % 2 == 1 && c % 3 == 2 && c % 5 == 4 && c % 6 == 5) {
    System.out.print("這個數字是:" + c);
    break;
   }else{
    c = c + 14;
   }
  }

再考慮:臺階階梯總數加一是爲2、3、5、6的最小公倍數,而且是7的倍數,所以定是30的倍數減1,可得如下算法:
            int x;
            for (int i = 1; i < 10; i++)
            {
                if ((i * 30 - 1) % 7 == 0)
                {
                    x = (i * 30 - 1);
                    System.out.println("這個數字是:" + x.ToString());
                }
            }

原文(作者博客)地址:www.52cfml.com

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章