`

编程题目(一)

阅读更多
1.函数:参数为两个字符串a,b ,判断 b 中是否包含 a ,若包含则返回首次出现的位置
	/**
	 * 判断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);
	}

}




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics