幾道有意思的java編程題目

1. Object數組中元素自動分類

/*
 * Object[]數組中元素自動分類,將如下objs數組中各個元素按其本身的類型存儲到具體類型的數組中
 * Object objs[] = { 45, "king", 56.45, "rose", 45.4f, true, 'A', false,"Jack", 56, 0.0, 0.012f, 'B', true, 'C' };
 */
public class FenLei {

	public static void main(String[] args) {
		Object objs[] = { 45, "king", 56.45, "rose", 45.4f, true, 'A', false,"Jack", 56, 0.0, 0.012f, 'B', true, 'C' };
		String[] sa = new String[3];
		int[] ia = new int[2];
		boolean[] ba = new boolean[3];
		char[] ca = new char[3];
		float[] fa = new float[2];
		double[] da = new double[2];
		int s=0,i=0,b=0,c=0,f=0,d=0;
		for(Object obj:objs){
			switch(obj.getClass().getName()){
			case "java.lang.Integer":
				ia[i++]=(int)obj;
				break;
			case "java.lang.String":
				sa[s++]=(String)obj;
				break;
			case "java.lang.Boolean":
				ba[b++]=(boolean)obj;
				break;
			case "java.lang.Double":
				da[d++]=(double)obj;
				break;
			case "java.lang.Float":
				fa[f++]=(float)obj;
				break;
			case "java.lang.Character":
				ca[c++]=(char)obj;
				break;
		    }	
		}
		print(ca);
	}
	public static void print(char[] ls){
		for(int i=0;i<ls.length;i++){
			if(i==ls.length-1)
				System.out.println(ls[i]);
			else
				System.out.print(ls[i]+",");
		}
	}	
}

2. 1000!的結果末尾有多少個零?

/*
 * 需求:求1000!的結果末尾有多少個零?
 * 思路:1. 1000!的計算結果可能超出了long的範圍,不能直接運算此階乘再數末尾的零
 *     2. 2*5就會使末尾多一個零,因爲1-1000之間,偶數足夠多,也就是因數2足夠多,所以結尾0的個數是由1-1000中因子5的個數決定
 *     3. 1-1000中一個數如果能被5整除,就至少含有一個因數5,如果除數還能被5整除(即被25整除),則至少含有2個因數5,能在末尾貢獻2個0,依次類推。。。
 */
class CountZero{
	public static void main(String[] args){
		System.out.println(countZero(10));
	}
	public static int countZero(int n)
    {
            int result = 0;
            int temp = 5;
            while (0 < temp && temp <= n)
            {
                    result += n / temp;
                    temp *= 5;
            }
            return result;
    }
}

3. 猴子分桃問題

/*
 *題目: 海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑據分爲五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。
 *    第二隻猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,
 *    問海灘上原來最少有多少個桃子?
 */
public class Ftao {

	public static void main(String[] args) {
		//從第五隻猴子分堆開始,往上遞歸
		//每堆的桃子數
		int averNum=1;
		//分堆之前的總數
		int sum=1;
	    int i=0;
	    boolean flag=false;
	    while(!flag){
	    	flag=true;
	    	//從最後一次分堆前的桃子數開始,依次遞推前面第四、三、二、一次分堆前的桃子數,如果遞推中每次分堆都能得到整數,就是符合條件的
	    	for(int j=0;j<4;j++){
	    		if(sum%4==0){
					averNum=sum/4;				
					sum=averNum*5+1;
				}
	    		else{
	    			flag=false;
	    			//每次分堆前桃子總數都是上一次分堆中的其中4份之和,且再拿走一個桃子可以再分成5份,滿足這個條件是必須是16、26、36、...這樣的數
	    			sum=(++i)*10+5+1;
	    			break;
	    		}    			
	    	}				
	    }
		System.out.println("海灘上原來最少有 "+sum+"個桃子!");
	}

}

4. 有100個人圍成一個圈,從1開始報數,報到14的這個人就要退出。然後其他人重新開始,從1報數,到14退出。問:最後剩下的是100人中的第幾個人?

import java.util.LinkedList;
import java.util.List;

public class Test4 {
        public static void main(String[] args) {
                game(100, 14);
        }

        public static void game(int person, int num) {
                List<Integer> list = new LinkedList<Integer>();
                for (int i = 1; i <= person; i++) {
                        list.add(i);
                }
                int pos = 0;
                while (list.size() > 1) {
				//每次記錄當前位置,數到num個後,刪除該位置上的元素
                        pos = (pos + num - 1) % list.size();
                        list.remove(pos);

                }
                System.out.println(person + "人玩數" + num +
                                ",最後剩下的是第" + list.get(0) + "人");
        }
}


未完待續。。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章