1. 程式人生 > >幾個有意思的演算法題(高斯日記、排它平方數、振興中華、顛倒的價牌)

幾個有意思的演算法題(高斯日記、排它平方數、振興中華、顛倒的價牌)

    大數學家高斯有個好習慣:無論如何都要記日記。

    他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210

    後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人:日子又過去一天,還有多少時光可以用於浪費呢?

    高斯出生於:1777年4月30日。
    
    在高斯發現的一個重要定理的日記上標註著:5343,因此可算出那天是:1791年12月15日。

    高斯獲得博士學位的那天日記上標著:8113  

    請你算出高斯獲得博士學位的年月日。

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

請嚴格按照格式,通過瀏覽器提交答案。
注意:只提交這個日期,不要寫其它附加內容,比如:說明性的文字。

分析:這實際就是“三天打魚、兩天晒網問題”。

程式實現:(java寫的)

  1. package Forth;  
  2. publicclass DateOfNdays {  
  3. /* 
  4.  * 高斯日記(給定日期,算出X天后的日期) 
  5.  */
  6.     /* 
  7.      * 是否是閏年 
  8.      */
  9.     boolean IsleapYear(int year){  
  10.         return (year % 400 == 0 || year % 4 == 0 && year % 
    100 != 0);  
  11.     }  
  12.     /* 
  13.      * 獲得某年某月的最大天數 
  14.      */
  15.     int GetMaxDay(int year,int month,int day){  
  16.         switch(month){  
  17.         case1:  
  18.         case3:  
  19.         case5:  
  20.         case7:  
  21.         case8:  
  22.         case10:  
  23.         case12:  
  24.             return31;  
  25.         case4:  
  26.         case6:  
  27.         case9:  
  28.         case11:  
  29.             return30;  
  30.         case2:  
  31.             return (IsleapYear(year)?29:28);  
  32.         default:  
  33.             return -1;  
  34.         }  
  35.     }  
  36.     /* 
  37.      * 獲得X天后的日期 
  38.      */
  39.     void GetXDays(int year,int month,int day,int X){  
  40.         for(int i = 1; i <= X; i++){  
  41.             if(day != GetMaxDay(year,month,day)){  
  42.                 day++;  
  43.             }else{  
  44.                 if(month != 12){  
  45.                     month++;  
  46.                     day = 1;  
  47.                 }else{  
  48.                     month = day = 1;  
  49.                     year++;  
  50.                 }  
  51.             }  
  52.         }  
  53.         System.out.println(X+"天后的日期是"+year+"/"+month+"/"+day);  
  54.     }  
  55. }  

答案:1799-7-16

2.題目標題: 排它平方數

    小明正看著 203879 這個數字發呆。

    原來,203879 * 203879 = 41566646641

    這有什麼神奇呢?仔細觀察,203879 是個6位數,並且它的每個數位上的數字都是不同的,並且它平方後的所有數位上都不出現組成它自身的數字。

    具有這樣特點的6位數還有一個,請你找出它!

    再歸納一下篩選要求:
    1. 6位正整數
    2. 每個數位上的數字不同
    3. 其平方數的每個數位不含原數字的任何組成數位

答案是一個6位的正整數。

請通過瀏覽器提交答案。
注意:只提交另一6位數,題中已經給出的這個不要提交。
注意:不要書寫其它的內容(比如:說明性的文字)。

  1. package Forth;  
  2. publicclass ExcludeNumber {  
  3. /* 
  4.  * 排它平方數 
  5.  */
  6.     long PingNum = 0//儲存平方
  7.     /* 
  8.      * 判斷一個數是否有重複數字 
  9.      */
  10.     publicboolean IsSame(long x){  
  11.         long store[] = newlong[7];  
  12.         long r;  
  13.         int i = 0;  
  14.         while(x != 0){ //分離該數的每一位,存入store陣列
  15.             r = x % 10;  
  16.             x = x / 10;  
  17.             store[i] = r;  
  18.             i++;  
  19.         }  
  20.         long result;  
  21.         for(int j = 0; j < 5; j++){ //判斷有無重複數
  22.             result = store[j];  
  23.             for(int k = j+1; k < 6; k++){  
  24.                 if(result == store[k])  
  25.                     returntrue;  
  26.             }  
  27.         }  
  28.         returnfalse;  
  29.     }  
  30.     publicboolean IsSame2(long Num,long n){  
  31.         long store[] = newlong[7];  
  32.         long r;  
  33.         int i = 0;  
  34.         while( n != 0){  
  35.             r = n % 10;  
  36.