1. 程式人生 > >幾個經典的程式設計題

幾個經典的程式設計題

1:一個農夫養了一頭牛,三年後,這頭牛每年會生出1頭牛,生出來的牛三年後,又可以每年生出一頭牛……問農夫10年後有多少頭牛?n年呢?

不難發現,第一年一頭牛,第二年1頭牛.....所以大概隨著年份增長牛的數量:1,1,2,3,5,8......當前年份的牛的數量等於前兩年牛的數量之和,所以:

import java.util.Scanner;

public class Test
{
public static void main(String[] args) {
        for(int i=1;i<=20;i++){
            System.out.println("第"+i+"年牛的數量:"+getOxs(i));
        }
 
    }
    public static int getOxs(int n){
        int answer = 0;
        if(n>=3){
            answer = 1;
            for(int i=1;i<=n-2;i++){
                answer += getOxs(i);
            }
        }else{
            answer = 1;
        }
        return answer;
    }
}

2:求出100——1000之間的所有水仙花數:

import java.util.Scanner;

public class Test
{
 
public static void main(String[] args) {
 for(int i=100;i<=999;i++) {
  int g,s,b;
  b=i/100;
  s=(i-b*100)/10;
  g=i-b*100-s*10;
  if(i==g*g*g+s*s*s+b*b*b) {
   System.out.println(i);
  }
 }
}
}                                                                    //之所以會放出這個是因為我在網上看到有大神寫的求出所有的水仙花數。。

3:隨便給你一個日期(例如2009-8-20),問這一天是星期幾?

兩種解法:直接使用calender:

import java.util.Calendar;
import java.util.GregorianCalendar;
public class alan

  public static void main(String[] args)
  {

Calendar calender =new GregorianCalendar(2017,7, 28);
    System.out.println( calender.get(Calendar.DAY_OF_WEEK)-1);
  }
}                                                                             //月份和日子都要減1

還有另一種演算法就是你慢慢算了,定義一個年份,比如公元元年,計算給定日期距離那一天有多少年,計算其中的閏年數

4:計算1000的階乘:

這個有意思了,:

BigInteger x = BigInteger.valueOf(1);

      for(int i=2; i<=1000; i++) {

          x = x.multiply(BigInteger.valueOf(i));

      }

      System.out.println(x);                                //直接使用biginteger當然可以但是與演算法無關,看到一個大神的演算法:

class Test { public static void main(String[] args) { int[] digits = new int[2568]; int max_digit = 2567; digits[max_digit] = 1; for (int d=2;d<=1000;d++) { for (int k=max_digit; k<digits.length; k++) digits[k] *= d; int k = digits.length-1; while (k>=max_digit) { if (digits[k]>10) { digits[k-1] += digits[k] / 10; digits[k] = digits[k] % 10; if (k-1<max_digit) max_digit = k-1; } k--; } } for (int i=max_digit; i<digits.length; i++) { System.out.print(digits[i]); } System.out.println(); } }                                                   大概是這樣的,1000階乘因為有2568位,可以定義一個數組,比如我計算5的階乘,先求5!的位數為3
陣列初始值為{0,0,1}
x2: {0,0,2}
x3: {0,0,6}
x4: {0,0,24} 進位=> {0,2,4}
x5: {0,10,20} 進位=> {0,12,0} 進位=> {1,2,0}
最後輸出120         
很有意思的題目,都是我在論壇翻出來的,可以消遣哈~