几个经典的编程题

来源:互联网 发布:云计算和大数据的关系 编辑:程序博客网 时间:2024/06/13 20:38

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         


很有意思的题目,都是我在论坛翻出来的,可以消遣哈~



原创粉丝点击