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
原文链接