算法题(4)

1.输入年,月,日,判断是该年的第几天

package work.com;

import java.util.Scanner;

public class Work0106 {
		
	public static void main(String[] args) {
//		输入
		Scanner sc = new Scanner(System.in);
		int year = 0;
		int month = 0;
		int date = 0;
		int sum = 0;
		while(true) {
			year=inputNum(sc,1,3000,"年份");
			month = inputNum(sc, 1, 12, "月份");
			date = inputNum(sc, 1, 31, "日期");
			boolean bb = valiDate(year, month, date,sum);
			if(bb) {
				break;
			}
			System.out.println("输入数据不合法");
		}
		System.out.println(year +"-"+month+"-"+date);
		
//		计算
		sum+=date;
//		输出
		System.out.println("是这个月的第"+sum+"天");
	}


	public static int inputNum(Scanner sc, int min, int max, String str) {
		int res = 0;
		while(true) {
			System.out.println(str+ ":");
			String ss = sc.nextLine();
			try {
				res = Integer.parseInt(ss);
				if(res>=min &&res <=max) {
					break;
				}
				System.out.println("请输入合理的"+str+"数据");
			} catch (Exception e) {
				System.out.println("输入"+str+"数据不合法");
			}
		}
		return res;
	}
	
  public static boolean valiDate( int year, int month, int date,int sum) {
		boolean res = false;
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 10:
		case 12:
			res = date <=31;
			sum+=31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			res = date <=30 && date >=1;
			sum+=30;
			break;
		case 2:
			boolean bb = run(year);
			if(bb) {
				res =date <=29 && date >=1;
				sum+=29;
			}else {
				res = date <=28 && date>=1;
				sum+=28;
			}
			break;
			
		default:
			break;
		}
		return res;
	}

private static boolean run(int year) {
	   return  (year%4!=0 &year%100==0 || year%400 ==0) ;
}
}

  1. 猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共吃了多少个桃子?
    第归解决
package work.com;
public class Work0107a {
    public static void main(String[] args) { 	
//    	猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 第二天,吃剩下的桃子的一半,还不过瘾,又多吃
//    	了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共吃了多少个桃子?
        System.out.println(total(1));
    }
    public static int total(int day){
        if(day == 10) {
        	return 1;
        }
        else {
        	return (total(day+1)+1)*2;
        }
    }
}

  1. 斐波那契在《算盘书》中提出了一个有趣的兔子问题:一般而言,兔子在出生两个月后,就有繁殖
    能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔
    子? 指的是这样一个数列:1、1、2、3、5、8、13、21、34…
package work.com;

import java.util.Scanner;
public class Work0107b {
	public static void main(String[] args) {
		int months = 0;
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("月份");
			String ss = sc.nextLine();
			try {
				months = Integer.parseInt(ss);
				if(months>0) {
					break;
				}
				System.out.println("请重新输入月份");
			} catch (Exception e) {
				System.out.println("请输入合法月份数");
			}
		}
				int num = tongji(months);
						System.out.println(months+"个月后兔子数为"+num);
	}

	public static int tongji(int months) {
		
			if(months ==1||months ==2) {
				return 1;
			}
			return tongji(months-1)+tongji(months-2);
		}
}

简化版 :

package shouxie.com;

import java.util.Scanner;

public class Tuzi2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String aa = sc.nextLine();
		int month = Integer.parseInt(aa);
		int sum = tongji(month);
		System.out.println(sum);
	}
	private static int tongji(int month) {
			if(month ==1 || month ==2) {
				return 1;
			}
			return tongji(month-1)+tongji(month-2);
	}
}

3.(汉诺塔问题)梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘移动次数是f(n).
显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1

package work.com;

public class Work0107 {

	public static void main(String[] args) {
	System.out.println(move(5));
	}
	public static int move(int n) {
		if(n==1) {
			return 1;
		}
		return 2* move(n-1)+1;	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值