java基本算法題及答案

基礎中的基礎題目。

題目1:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一
對兔子,假如兔子都不死,問每個月的兔子總數爲多少? 

程序分析: 兔子的規律爲數列1,1,2,3,5,8,13,21…. 
(斐波那契(Fibonacci)數列)

遞歸寫法

public int count(int n){
        int x=0;
        if (n<=0) {
            return 0;
        }
        if (n==1||n==2) {
            return 1;   
        }
        else {
            return count(n-1)+count(n-2);
        }

遞推寫法:

public int count(int n){
        //x,y表示第一個月和第二個月兔子對數
        int x=1,y=1,result=0;
        if (n==0) {
            return 0;   
        }if (n==1||n==2) {
            return 1;
        }
        else {
            for(int i=0;i<n-2;i++){
                //f(n)=f(n-1)+f(n-2)
                result=x+y;
                //f(n-1)=f(n)
                y=result;
                //f(n-2)=f(n-1)
                x=y;
            }
        }       
        return result;

題目2:判斷101-200之間有多少個素數,並輸出所有素數。
思路:用一個數分別去除2到這個數,如果能被整除, 
則表明此數不是素數,反之是素數。 


for(int j=101;j<201;j++)
        {
            for(int i=2;i<j;i++)
            {
                if (j%i==0) {
                    break;
                }else {
                    System.out.println(j);
                    break;
                }
            }
        }

題目3:打印出所有的”水仙花數”,所謂”水仙花數”是指一個三位數,其各位數字 立方和等於該數本身。
例如:
153是一個”水仙花數”,因爲153=1的三次方+5的三次方+3的三次方。 


public class Demo {
    //得到各個位置的數字
    int solution(int n){
        int x=n/100;
        n-=(x*100);
        int y=n/10;
        n-=(y*10);
        int z=n;
        return x*x*x+y*y*y+z*z*z;       
    }
    public static void main(String[] args)  
    {       
        Demo queueDemo=new Demo();

        for (int i = 100; i < 1000; i++) {
            if (i==queueDemo.solution(i)) {
                System.out.println(i);      
            }   
        }
}
}

題目4_:
將一個正整數分解質因數。
例如:輸入90,打印出90=2*3*3*5。 

程序分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:

(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。 
(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作爲新的正整數你n,重複執行第一步。


(3)如果n不能被k整除,則用k+1作爲k的值,重複執行第一步。 





void solution(int n){
        for(int i=2;i<n/2;i++){
            if (n%i==0) {
                System.out.print(i+"*");
                solution(n/i);
            }
        }
        System.out.println(n);
        System.exit(0);;

題目5:
利用條件運算符的嵌套來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示,60分以下
的用C表示。 

1.程序分析:(a>b)?a:b這是條件運算符的基本例子。 


System.out.println(n>=90?"A":(n>=60?"B":"C"));

題目6:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 


//最小公倍數,從兩個數中最大的數逐一往上找,滿足條件的第一個即爲最小公倍數
void min_solution(int m,int n){
        for(int i=(m>n?n:m);i<=m*n;i++)
        {
            if(i%m==0 && i%n==0)
            {
                System.out.println("最小公倍數爲"+i);
                break;
            }
        }
}
//最大公約數,從兩個數中較小的開始逐一往小的找,滿足條件的第一個數即爲最大公約數
void max_solution(int m,int n){
    for(int i=(m>n?n:m);i>0;i--){
        if (n%i==0 && m%i==0) 
        {
            System.out.println("最大公約數"+i);
            break;  
        }   
    }   
}

題目7:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。 


public static void main(String[] args)  
    {       
        int x=30,y=15;
        Demo demo=new Demo();
        String s="sadfa8683423  sd22 ......a";
        char[] a=s.toCharArray();
        demo.solution(a);

        }
    private void solution(char[] a) {
        int x=0,y=0,z=0,k=0;
        char c;
        for (int i = 0; i < a.length; i++) {
             c = a[i];
             //字母
            if ((c>='a'&& c<='z')||(c>='A' && c<='z')) {
                x++;
            }
            //數字
            else if (c>='0' && c<='9') {
                y++;    
            }
            //空格
            else if(c==' ') {
                z++;        
            }
            //其他字符
            else {
                k++;
            }
        }
        System.out.println("字母有"+x+"個,數字有"+y+"個,空格有"+z+"個,其他字符有"+k+"個");
    }

題目8:
求s=a+aa+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),
幾個數相加由鍵盤控制。 


    private void solution(int x,int num) {
        //num爲鍵盤控制有幾個數相加
        //x爲要想加的數字
        int result=0,temp=0;
        for(int i=0;i<num;i++)
        {
            temp=result+(int) (Math.pow(10, i)*x);  
            result+=temp;

        }
        System.out.println(result);
    }

題目9:一個數如果恰好等於它的因子之和,這個數就稱爲”完數”。例如6=1+2+3.編程 找出1000以內的所有完
數。 


public static void main(String[] args)  
    {   
        Demo demo=new Demo();
        for(int i=1;i<=1000;i++){
            demo.solution(i);
        }   
    }
    private void solution(int x) {
        int result=0;
        //set集合不能存放相同的元素,所以選擇set來做
        Set< Integer> set=new HashSet<>();
        for (int i = 1; i < x; i++) {
            if (x%i==0) {
                //得到兩個因子
                set.add(x/i);
                set.add(i); 
            }
        }
        Iterator<Integer> inIterator=set.iterator();
        while (inIterator.hasNext()) {
            result+=inIterator.next();  
        }
        //記得減掉一個x,因爲在前面遍歷的時候加上了
        if ((result-x)==x) {
            System.out.println(x);
        }       
    }

題目10:題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?

public static void main(String[] args)  
    {   
        Demo demo=new Demo();
        int x=0,y=0;
        for(int i=1;i<=100;i++){    
            x=i+100;
            y=i+268;
            if (demo.solution(x)==0&&demo.solution(y)==0) {
                System.out.println(i);
            }
        }   
    }
    private int solution(int x) {
        //得到平方根後的字符串
        String s=String.valueOf(Math.sqrt(x));
        //進行切割,注意:String.split()方法中裏面的參數如果是".\"等轉義字符,要在前面增加"\\"
        String[] spilt=s.split("\\.");
        if (spilt[1].length()>1) {
            return -1;
        }else if (spilt[1].equals("0")) 
        {
            return 0;
        }else {
            return -1;
        }
    }
    結果爲21.

題目11:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個數列的前20項之和。 


public static void main(String[] args)  
    {   
        double result=0;
        double up=2,down=1;
        for(int i=1;i<22;i++){

            result+=up/down;
            double temp=down;
            down=up;
            up+=temp;   
        }
        System.out.println(result);

    }

題目12:求1+2!+3!+…+20!的和 
(遞歸做,這裏懶得寫了)

題目13:給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。

public static void main(String[] args)  
    {   
        int num=2345;
        for(int i=1;i<6;i++)
            if ((num/Math.pow(10, i))<10&&(num/Math.pow(10, i))>1) {
                System.out.println("這是"+(i+1)+"位數");

            }
        //翻轉整數
        int temp=num;
        int result=0;
        while (temp!=0) {
            result=result*10+temp%10;
            temp/=10;
        }
        System.out.println(result);

    }

題目14:一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。

    public static void main(String[] args)  
    {   
        String num="12344321";
        char[] a=num.toCharArray();
        for (int i = 0,j=a.length-1; i <a.length/2; i++,j--) {
            if (a[i]!=a[j]) {
                System.out.println("不是迴文");
                break;
            }
        }
    }

題目15:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。

public static void main(String[] args) {
        final int n = 10;
        final int flag = 3;

        List<Integer> mans = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            mans.add(i + 1);
        }
        System.out.println("初始化編號爲" + mans + "的" + mans.size() + "個人圍成一圈");

        ListIterator<Integer> iter = null;
        int k = 1;
        do {
            iter = mans.listIterator();
            while (iter.hasNext()) {
                int i = iter.next();
                if (k++ % flag == 0) {
                    System.out.println("編號" + i + "的人退出圈子");
                    iter.remove();
                    k = 1;
                }
            }
        } while (mans.size() > 1);

        System.out.println("剩下編號爲" + mans + "的" + mans.size() + "個人");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章