/** * 判断b中是否包含a,若包含,返回首次出现的位置 * @param a 短字符串 * @param b 长字符串 * @return */ public static int indexOfSubString(String a ,String b){ int aLength = a.length() ; int bLength = b.length() ; // a 的长度大于 b ,非法,返回 -1 if(aLength > bLength){ return -1 ; } // b 中不包含 a ,返回 -1 if(!b.contains(a)){ return -1 ; } // a 等于 b if(aLength == bLength && a.equals(b)){ return 0 ; } int index = b.indexOf(a); return index; }
2.兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。初始有一对小兔子,假设所有兔子都不死,那么一年以后可以繁殖多少对兔子?
/** * 兔子繁殖问题分析 * 因为兔子每3个月生一对小兔子,分成三个阶段青年、中年、老年,只有达到老年的兔子才能生一对小兔子 * 月份 1 2 3 4 5 6 7 * 老年 0 0 1 1 2 3 5 * 中年 0 1 0 1 1 2 3 * 青年 1 0 1 1 2 3 5 * * 总结: * 月份/兔子对数 1 2 3 4 5 6 7 * 1 1 2 3 5 8 13 * f1 = 1 , f2 = 1 , f3 = 2 = f1 + f2 ... * 进而: * f(n) = f(n-1) + f(n-2) */ public class RabbitTestMain { /** * @param args */ public static void main(String[] args) { int month = 4 ; // 定义月数 int rabbitCount = countRabbit(month); System.out.println(rabbitCount); int rabbitCount2 = rabbitCount2(month); System.out.println(rabbitCount2); } /** * 计算第N个月有多少只兔子 * @param monthNum 月数 * @return */ public static int countRabbit(int monthNum){ int f1 = 1 ; // 第一个月 1 对 int f2 = 1 ; // 第二个月 2 对 int t = 0 ; // 临时变量 for(int i = 2 ; i < monthNum ; i++){ t = f2 ; // 记录 f2 的值,f2的值为 f1+f2 ; f1 赋值为 f2 的值 f2 = f1 + f2; f1 = t ; } return f2 ; } /** * 计算第N个月有多少只兔子 * 递归 f(n) = f(n-1) + f(n-2) * @param monthNum 月数 * @return */ public static int rabbitCount2(int monthNum){ if(monthNum <= 2){ return 1 ; } return rabbitCount2(monthNum - 1)+rabbitCount2(monthNum-2); } }
3.判断 101 ~ 200 之间有多少个素数并输出
/** * 求一个范围内的素数的数量 * 素数:只能被1和自身整除的数 * 算法:若一个数,依次与 2 到 次数的开方 ,如果能被整除,则说明次数不是素数 */ public class PrimeNumberTestMain { /** * @param args */ public static void main(String[] args) { // System.out.println(Math.sqrt(5)); primeNumber(); } public static void primeNumber(){ int count = 0 ; for(int i = 100 ; i <= 200 ; i++){ boolean isFlag = false ; for(int j = 2 ; j <= Math.sqrt(i) ; j++){ if(i % j == 0 ){ isFlag = false ; break ; }else{ isFlag = true ; } } if(isFlag){ count ++ ; System.out.println(i); } } System.out.println("count:"+count); } }
4.水仙花数
/** * 打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。 */ public class SpecialNumTestMain { /** * @param args * * 需求分解: * 1.三位数,确认范围 100 - 999 * 2.各位数字立方和,求各位数字 * */ public static void main(String[] args) { for(int index = 100 ; index <= 999 ; index ++){ int a = index /100 ; // 百位,除法取整 int b = index / 10 % 10 ; // 十位 int c = index % 100 % 10 ; // 个位 if(a*a*a + b*b*b + c*c*c == index){ System.out.println(index); } } test(); } public static void test(){ int index = 123 ; int a = index /100 ; // 百位 int b = index / 10 % 10 ; // 十位 int c = index % 100 % 10 ; // 个位 System.out.println(a + " " + b + " " + c); } }
5.因数分解
/** * 因式分解 * 输入24,结果为:24=2*2*2*3 */ public class FactorAnalysisTestMain { /** * @param args * 分析: * 给定的数据为 n * 从某个值k 起 * 若 k == n ,则结果为 n = 1 * k * 若 k != n , * 若 n % k == 0 , n = k * ... ;n = n/ k ,重复上述判断,直到 n <= k */ public static void main(String[] args) { int n = 24 ; int k = 2 ; StringBuilder sb = new StringBuilder(n+"="); while (k<=n){ if(n % k == 0){ n = n/k; sb.append(k).append("*"); }else{ k ++ ; } } String s = sb.toString().substring(0,sb.toString().length() - 1); System.out.println(s); } }
6.求两个数的最大公约数与最小公倍数
/** * 求两个数的最大公约数、最小公倍数 */ public class NumDoubleTestMain { /** * @param args */ public static void main(String[] args) { int a = 4 ; int b = 6 ; int c = method1(a, b); int d = method2(a, b, c); System.out.println("c:"+c+" d:"+d); } /** * 最大公约数 * 用较大的数与较小的数取余;直到余数为0位置 * @param a * @param b * @return */ public static int method1(int a ,int b){ // 如果两个数字相等 if(a == b){ return a ; } if(a > b){ int temp = a ; b = a ; a = temp ; } // 判断大小 int min = a ; int max = b ; // 取余 while(min != 0){ int k = max % min ; max = min ; min = k ; System.out.println(k+" "+max+" "+min); } return max ; } /** * 最小公倍数 * * @param a * @param b * @param c * @return */ public static int method2(int a , int b ,int c){ return a*b/c ; } }
7.一个数如果恰好等于它的因子之和,这个数就称为“完数”。编写应用程序,求1000之内的所有完数
/** * 一个数如果恰好等于它的因子之和,这个数就称为“完数”。编写应用程序,求1000之内的所有完数 * 6 = 1 * 2 * 3 * 6 = 1 + 2 + 3 */ public class CombineNumberTestMain { /** * @param args */ public static void main(String[] args) { for(int i = 1 ; i <= 1000 ; i++){ int sum = 0 ; /** * 求此数的所有因数,i/2 缩小比较范围 * 所有因数的和是否等于i */ for(int j = 1 ; j <= i/2 ; j++){ if(i % j == 0){ sum = sum + j ; } } if(sum == i){ System.out.println(i); } } } }
8.有 1、2、3、4 四个数字能够组成多少互不相同且无重复数字的三位数
/** * 有 1、2、3、4 四个数字能够组成多少互不相同且无重复数字的三位数 */ public class AbsoluteNumberTestMain { /** * @param args */ public static void main(String[] args) { /** * 误:想偏了,高位为1 ,后续多少中变化;高位为2,...... * 正:三位数,三层循环,保证最后一次循环时,三位数各不相同 */ int count = 0 ; for(int i = 1 ; i < 5 ; i ++){ for(int j = 1 ; j < 5 ; j++){ for(int k = 1 ; k < 5 ; k++){ if(i != j && i != k && j !=k){ count ++ ; System.out.println(i*100+j*10+k); } } } } System.out.println(count); } }