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