1. 程式人生 > >JAVA基礎程式設計練習50題

JAVA基礎程式設計練習50題

本文對50道經典的java程式題進行詳細解說,對於初學者可以跳過一些邏輯性太強的題目,比如第一題用到了方法的遞迴,初學者可能不理解,最好先看那些有if、for、while可以簡單解決的程式題!但是,對於比較深入學習過的同學,還是希望可以一口氣就看完,這是比較全面思維鍛鍊!

【程式1】

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

程式分析:兔子的規律為數列1,1,2,3,5,8,13,21....

做這種題目,最好的做法就是找出規律,跟高中的數列一樣

本題有:a[n]=a[n-1]+a[n-1],而第一第二項都知道了,後面的值也可以求得

public class Programme1 {

    public static void main(String[] args) {

       System.out.print("請輸入你想知道的兔子數量的月份:");

       Scanner scanner=new Scanner(System.in);

       int n=scanner.nextInt();//獲取輸入的整數

       System.out.println(""+n+"個月兔子總數為"+fun(n));

       scanner.close();

    }

    //求得所需月份的兔子的數量,返回值為兔子的數量

    private static int fun(intn){

       if(n==1 ||n==2)

          return 1;

       else

          returnfun(n-1)+fun(n-2);

           }

}


【程式2】

題目:判斷101-200之間有多少個素數,並輸出所有素數。

程式分析:

 * 素數是:只能被1或本身整除的數,如:3,5,7,11,131... 

      *判斷素數的方法:用一個數分別去除2到sqrt(這個數),

      *其實用這個數分別去除2到他本身少1的數也可以,但是運算時間增加了

      *如果能被整除,則表明此數不是素數,反之是素數。

public class Programme2 {

    public static void main(String[] args) {

       int sum=0;

        for (inti = 100; i < 200;i++) {

           if (IsRightNum(i)) { //判斷這個數是不是素數

              System.out.print(i+"  ");

              sum++;

              if (sum%10==0) { //十個一行

                  System.out.println();

              }

           }

       }

        System.out.println("素數的整數:"+sum);

    }

    //判斷這個數是不是素數的具體程式碼

    private static boolean IsRightNum(inti) {

       for (intj = 2; j < Math.sqrt(i);j++) {

           if (i%j==0) { //如果能整除,就說明不是素數,可以馬上中斷,繼續對下一個數判斷

              return false;

           }

       }     

       return true;

    }

}


【程式3】

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

程式分析:利用for迴圈控制100-999個數,每個數分解出個位,十位,百位。

public class Programme3 {

    public static void main(String[] args) {

       int sum=0;//水仙花的總數

       for (inti = 100; i < 1000;i++) {

           intbite=i%10;     //求得個位

           intten=i/10%10;  //求得十位

           inthundred=i/100;//求得百位

           //如果符合水仙花條件的數打印出來

           if (i==(bite*bite*bite)+

(ten*ten*ten)+(hundred*hundred*hundred)) {

              System.out.print(i+"  ");

              sum++;

           }

       }

       System.out.println("總共有水仙花個數:"+sum);     

    }

}


【程式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的值,重複執行第一步。

public class Programme4 {

    public static void main(String[] args) {

       System.out.print("請輸入一個你要分解的正整數:");

       Scanner scanner=new Scanner(System.in);

       int input=scanner.nextInt();//獲取輸入的數字

       System.out.println();

       System.out.print(input+"=");

       for (inti = 2; i < input+1; i++) {             

           while(input%i==0&&input!=i) {

              input=input/i;

              System.out.print(i+"*");          

           }  

           if(input==i){//上面的都不能整除,說明這是一個質數

              System.out.print(i);

              break;

           }         

       }         

       scanner.close();

    }  

}


【程式5】

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

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

public class Programme5 {

    public static void main(String[] args) {

       System.out.println("請輸入你的分數:");

       Scanner scanner=new Scanner(System.in);

        int input=scanner.nextInt();//獲取輸入

//等級判斷

       String belong=input>=90?"A":(input>=60?"B":"c");

       System.out.println(input+"分屬於:"+belong);

       scanner.close();    

    }

}


【程式6】

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

程式分析:利用輾除法。

 *這裡有一個知識點要記住的,最大公約數和最小公倍數的求法

 *1、先求最大公約數bigDivisor

 *2、就可以很方便獲得最小公倍數multiple=input1*input2/bigDIvisor

 *這裡最重要的就是求最大公約數:求法如下

 *(1)用大的數對小的數求餘

 *(2)把小的數賦值給大的數,把求餘獲得的結果賦值給小的數,

 *(3)迴圈上一步的操作,直到求餘的結果為零

 *(4)上一步被求餘的數就是我們要的最大公約數,不信的話,你可以動手試試

public class Programme6 {

    public static void main(String[] args) {

       int bigDivisor=0;//定義最大公約數

       int multiple=0;//定義最小公倍數

       System.out.println("請輸入兩個整數:");

       Scanner scanner = new Scanner(System.in);

       int input1 = scanner.nextInt();//獲取第一個數

       int input2 = scanner.nextInt();//獲取第二個數

       multiple=input1*input2;//這個值儲存,求公約數後,方便求得最小公倍數

       int temp =1;// 交換用的中間數

       if (input2 >input1) {//確保第一個數不小於第二個數

           temp=input1;

           input1=input2;

           input2=temp;

       }

       while (temp!=0) { //求餘結果不等於零,就一直迴圈

            temp=input1%input2;//求餘結果

            input1=input2;//大的數已經沒用了,用小的數替代

            input2=temp;//把求餘的結果賦值給小的數

       }

       bigDivisor=input1;//最後一次求餘結果為零時,被求餘的數

       multiple=multiple/bigDivisor;

       System.out.println("最大公約數是:"+bigDivisor );

       System.out.println("最小公倍數是:"+multiple);    

       scanner.close();

    }

}


【程式7】

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

程式分析:

這裡的需要的知識點:

    1、獲取一行字串,nextLine()

    2、把字串的每一個字元賦值到一個數值中

    3、對比每一個數值在ASK碼的範圍,就可以確定它符號的類別

    4char字元ASK碼的範圍

1)數字09 48~57

2)字母AZ6590 az97122

3)空格是32 

 public class Programme7 {

    public static void main(String[] args) {

       int num=0;//數字的個數

       int letter=0;//字母的個數

       int space=0;//空格的個數

       int others=0;//其他的個數

       System.out.println("請輸入一串字元:");

       Scanner scanner=new Scanner(System.in);

       String string=scanner.nextLine();//獲取一行字串

       //把字串裡面的值賦值給一個字元型陣列

       char[]arr=string.toCharArray();

       //遍歷字串裡面的所有值

       for (inti = 0; i < arr.lengthi++) {       

           if (arr[i]>=48&&arr[i]<=57) {//字元是數字

              num++;

       } else if((arr[i]>=65&&arr[i]<=90)||(arr[i]>=97&&arr[i]<=122)) {

              letter++;

           }else if (arr[i]==32) {

              space++;

           }else {

              others++;

           }

       }

       System.out.println("數字:"+num+"個,字母:"+letter+"個,空格:"+space+"個,其他:"+others+"");         

       scanner.close();

    }

}

【程式8】

題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。輸出結果的形式如:2+22+222=246;

程式分析:關鍵是計算出每一項的值。

      比如獲取的數字為:a,出現的項數為:n

      總結一下,可以得到一下規律:

       1、第一項有一個a,最後一項有n個a

       2、 第1和第2項相差2*10,第2和第三項相差2*100,第k和第k+1項相差2*(10的k次方)

public class Programme8 {

    public static void main(String[] args) {

       int n=0,a=0;

       Scanner scanner=new Scanner(System.in);

       System.out.println("請輸入a的值:");

       a=scanner.nextInt();

       System.out.println("請輸入n的值:");

       n=scanner.nextInt();

       int[] arr=new int[n];//建立陣列長度為輸入的項數

       int i=1;//while迴圈初始化的值

       arr[0]=a;//陣列的第一個值為3

       //把每一項的值賦值給數組裡面的數

       while (i<n) {

           a*=10;

           arr[i]=a+arr[i-1];

           i++;         

       }

       //求和

       int sum=0;

       for(ints:arr){

           sum+=s;//累加求和

           if (s==arr[n-1]) {

              System.out.print(s);

              break;//最後一次只輸出結果

           }

           System.out.print(s+"+");//前面的值輸出結果,後面還要加一個加號

       }

       System.out.println("="+sum);//完美結束

    }

}


【程式9】

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

判斷完數的方法:

      *  利用for迴圈判斷所有因數的和是否和輸入的值是否相等,相等的話輸出

      *  求因數的方法:

      *  (1)兩個巢狀迴圈,並用i%j==0,關於i和j的值範圍:i從1到1000逐個遍歷,j只需不大於i/2+1即可

      *  比如:48,最大的因數才24,99最大的因數是33,因數不會大於本身數的一半

      *  (2)j就是我們所求的因數,把所有的j相加,就可以得到因數總和

      *  (3)因數總和已經包含1了,因為第一次就儲存1了

public class Programme9 {

    public static void main(String[] args) {

       System.out.println("1000以內的因數有:");

       for (inti = 1; i <=1000;i++) {

           intsum=0;//所有因數的總和

           for (intj = 1; j < i/2+1; j++) {

              if (i%j==0) {//判斷範圍內的所有j相加,就是因數總和

                  sum=sum+j;

                  if (i==sum) {

                     System.out.print(i+"  ");

                  }

              }

           }

       }

    }

}


【程式10】

題目:一球從h米高度自由落下,每次落地後反跳回原高度的一半;

       再落下,求它在 第n次落地時,共經過多少米?第n次反彈多高?

程式分析:反彈的高度:(1/2)的n次方*h

      * 經過的距離:這個可以總結得到:第一次落地經過:h,第二次落地經過:h+(h/2)*2,

      * 第三次落地經過:h+(h/2)*2+(h/2/2)*2 

      * 那麼第n次落地經過:  h+(h/2)*2+(h/2/2)*2 +...+h/(2的n-1次方)*2

public class Programme10 {

    public static void main(String[] args) {

       System.out.println("請輸入小球下落的高度和落地的次數:");

       Scanner scanner=new Scanner(System.in);

       float h=scanner.nextFloat();

       float n=scanner.nextFloat();

       //float h=100,n=3;      

       float sum=h;//經過的路徑總和

       h/=2;//第一次下落是在最高點,sum中不會有兩倍的h,所以寫在外面,迴圈從第二次開始

       for (inti = 2; i <=ni++) {

           //經過的距離的總和

           sum+=h*2;

           //N次反彈的高度為

           h /=2;       

       }

       System.out.println(""+100+"米,經過"+n+"次後,能反彈:"+h+"米,經過的距離:"+sum);

       scanner.close();

    }

}


【程式11】

題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?

程式分析:可填在百位、十位、個位的數字都是1、2、3、4。這裡要用3個for迴圈

         用if判斷條件是否符合,符合條件的數字打印出來,並計算個數總和

public class Programme11 {

    public static void main(String[] args) {

       int sum=0;

       for (intbite = 1; bite < 5;bite++) {

           for (intten = 1; ten < 5;ten++) {

              for (inthundred = 1; hundred < 5;hundred++) {

                  if (bite!=ten&&bite!=hundred&&ten!=hundred) {//符合條件的數字

                     System.out.print((hundred*100+ten*10+bite)+"  ");

                     sum++;//計算個數

                     if (sum%10==0) {//十個一行

                     System.out.println();

                     }

                  }

              }

           }

       }

       System.out.println("\n總共有:"+sum+"個這樣的數");

    }

}


【程式12】

題目:企業發放的獎金根據利潤提成。利潤(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%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?

程式分析:請利用數軸來