package com.ccl.algo;

public class Classical {

	/**
	 * @param args
	 * @author changlun.cheng
	 * @see 默默寒窗苦code
	 */
	public static void main(String[] args) {

		Classical c = new Classical();

		c.rabbit(30);
		System.out.println();
		c.prime(102, 200);
		System.out.println();
		c.daffodil(10, 9999);
		System.out.println();
		// c.resolve(90);
		System.out.println();

		c.score(89);
		System.out.println();

		c.total("sasd 2 BDFS 】》?ぼ1 sad !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ 你妹·");

		c.salary(1100000.1);

		System.out.println(c.getDay(1900, 12, 2));

	}

	/**
	 * @param year
	 * @param month
	 * @param day
	 * @return 这天是一年中的第几天
	 */

	public int getDay(int year, int month, int day) {

		int indexDay = 0;

		switch (month) {

		case 1:
			indexDay = 0;
			break;
		case 2:
			indexDay = 31;
			break;
		case 3:
			indexDay = 59;
			break;
		case 4:
			indexDay = 90;
			break;
		case 5:
			indexDay = 120;
			break;
		case 6:
			indexDay = 151;
			break;
		case 7:
			indexDay = 181;
			break;
		case 8:
			indexDay = 212;
			break;
		case 9:
			indexDay = 243;
			break;
		case 10:
			indexDay = 273;
			break;
		case 11:
			indexDay = 304;
			break;
		case 12:
			indexDay = 334;
			break;
		default:
			break;
		}

		int flag = 0;
		if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
			flag = 1;
		if (flag == 1 && month > 2)
			indexDay++;
		indexDay += day;

		return indexDay;
	}

	/**
	 * @definition powerful a>b?b:a
	 * @param sal
	 *            <pre>
	 * 企业发放的奖金根据利润提成:
	 * 利润(I)低于或等于10万元时,奖金可提10%;
	 * 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
	 *   20万到40万之间时,高于20万元的部分,可提成5%;
	 *   40万到60万之间时,高于40万元的部分,,可提成3%;
	 *   60万到100万之间时,高于60万元的部分,可提成1.5%,
	 *   高于100万元时,超过100万元的部分按1%提成.
	 * </pre>
	 * 
	 */
	public void salary(double sal) {

		java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");

		double PROFIT_0_10 = 0.1, PROFIT_10_20 = 0.075, PROFIT_20_40 = 0.05, PROFIT_40_60 = 0.03, PROFIT_60_100 = 0.015, PROFIT_100 = 0.01;

		int wan = 10000;

		double profit = sal > 100 * wan ? (sal - 100 * wan) * PROFIT_100
				: (sal > 60 * wan ? (sal - 60 * wan) * PROFIT_60_100
						: (sal > 40 * wan ? (sal - 40 * wan) * PROFIT_40_60
								: (sal > 20 * wan ? (sal - 20 * wan)
										* PROFIT_20_40
										: (sal > 10 * wan ? ((sal - 10 * wan)
												* PROFIT_10_20 + 10 * wan
												* PROFIT_0_10)
												: (sal * PROFIT_0_10)))));

		System.out
				.println("salary: " + (sal + profit) + "\t profit: " + profit);

		System.out.println("salary: " + df.format((sal + profit))
				+ "\t profit: " + df.format(profit));

	}

	/**
	 * 统计字母/数字/空格/标点符号/中文/其他
	 * 
	 * @param str
	 */
	public void total(String str) {

		int word = 0, number = 0, space = 0, sign = 0, chinese = 0, other = 0;

		String E1 = "^[A-Za-z]$";// 字母

		String E2 = "[0-9]";// 数字

		String E3 = "\\p{Space}";// ="\\s"

		String E4 = "\\p{Punct}";// 标点符号

		String E5 = "[\u4e00-\u9fa5]";// 中文

		char[] array = str.toCharArray();
		for (char c : array) {

			str = c + "";

			if (str.matches(E1)) {
				word++;
			} else if (str.matches(E2)) {
				number++;
			} else if (str.matches(E3)) {
				space++;
			} else if (str.matches(E4)) {
				sign++;
			} else if (str.matches(E5)) {
				chinese++;
			} else {
				other++;
			}

		}

		System.out.println("word:" + word + "\t number:" + number + "\t space:"
				+ space + "\t sign:" + sign + "\t chinese:" + chinese
				+ "\t other:" + other);

	}

	/**
	 * boolean(a,b)?a:b
	 * 
	 * @param score
	 */
	public void score(int score) {

		char c = score >= 90 ? 'A' : (score >= 80 ? 'B' : (score >= 70 ? 'C'
				: (score >= 60 ? 'D' : 'E')));

		System.out.println("grade:" + c);

	}

	/**
	 * @result if(f1||f2)先执行f1如果f1d返回的true就不会执行f2
	 */

	/**
	 * 分解数位素数因子 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
	 * 
	 * @param N
	 */

	public void resolve(int N) {

		for (int i = 2; i < N; i++) {
			if (isPrime(i)) {// 判断是素数,不用判斷也行
				if (N % i == 0) {
					System.out.print(i + "*");
					resolve(N / i);
				}
			}

		}
		System.out.print(N);
		System.exit(0);// 告诉JVM不要再运行了。
	}

	/**
	 * 打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个
	 * "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方 扩展到n位数的水仙花数,就是有多少位数就分各位数的n方加起来==本身
	 * 
	 * @param start
	 * @param end
	 */
	public void daffodil(int start, int end) {

		for (; start <= end; start++) {
			if (isDaffodil(start))
				System.out.print(start + "\t");
		}

	}

	/**
	 * 是不是水仙花数
	 * 
	 * @char[] cs cs[0]作运算时 会转成ASCLL码数
	 * @param param
	 * @return
	 */
	private boolean isDaffodil(int param) {

		String s = param + "";

		int len = s.length();

		char[] cs = s.toCharArray();

		int r = 0;
		for (int i = 0; i < len; i++) {

			r += sqrt(Integer.parseInt(cs[i] + ""), len);

		}

		if (r == param)
			return true;

		return false;
	}

	/**
	 * len方数
	 * 
	 * @param i
	 * @param len
	 * @return
	 */
	private int sqrt(int i, int len) {

		int result = i;
		for (int j = 1; j < len; j++)
			result *= i;

		return result;

	}

	/**
	 * 判断start-end之间有多少个素数,并输出所有素数。
	 */
	public void prime(int start, int end) {

		for (; start <= end; start++) {

			if (isPrime(start))
				System.out.print(start + "\t");
		}

	}

	/**
	 * 判断是否是素数=质数
	 * 
	 * @param param
	 * @return
	 */
	public boolean isPrime(int param) {

		for (int i = 2; i < param / 2; i++)
			if (param % i == 0)
				return false;

		return true;
	}

	/**
	 * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
	 * 
	 * 1 1 2 3 5 8 13 21 34 55 89 144... 递归返回,要从最多月开始往下算,如果我知道上两个月有多少,这个月的我就知道了。
	 * == 上两个月加起来
	 * 
	 * @param n
	 */
	public void rabbit(int n) {

		for (int i = 1; i < n; i++) {
			System.out.print(function(i) + "\t");
		}

	}

	private int function(int i) {

		if (i == 1 || i == 2)
			return 1;
		else {
			return function(i - 1) + function(i - 2);
		}

	}

}


作者:chengchanglun 发表于2012-4-12 17:08:39 原文链接
阅读:109 评论:0 查看评论