1. 程式人生 > >Java經典50題

Java經典50題

轉載原創:https://blog.csdn.net/wenzhi20102321/article/details/52274976

 

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.length; i++) {       

           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 <=n; i++) {

           //經過的距離的總和

           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,求應發放獎金總數?

程式分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。

      超過   10    20       40        60          100          

           10*0.1  10*0.075   20*0.05    20*0.03     40*0.015      0.01

              1     1.75         2.75     3.35           3.95    

public class Programme12 {

    public static void main(String[] args) {

       System.out.println("請輸入你創造的利潤(單位:萬元):");

       Scanner scanner=new Scanner(System.in);

       while (!scanner.hasNextDouble()) {

           System.out.println("請輸入金額數字:");

           scanner.next();         

       }

       doubleprofit=scanner.nextDouble();

       doublebonus=0;

       if (profit<=10) {

           bonus=profit*0.1;

       }else if(profit<=20){

           bonus=(profit-10)*0.075+1; 

       }else if (profit<=40 ) {

           bonus=(profit-10)*0.05+1.75;   

       }else if (profit<=60 ) {

           bonus=(profit-10)*0.03+2.75;   

       }else if (profit<=100 ) {

           bonus=(profit-10)*0.015+3.35;  

       }else {

           bonus=(profit-100)*0.01+3.95;

       }

       System.out.println(profit+"萬元利潤,可以獲得:"+bonus+"萬元");

       scanner.close();

    }

}

 


【程式13】

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

程式分析:在10萬以內判斷,

     用for迴圈判斷:先將該數加上100後再開方,再將該數加上268後再開方,

     如果開方後的結果再平方後分別和i+100,i+268相等,即是結果。 

public class Prog13{

public class Programme13 {

    public static void main(String[] args) {

       for (inti = 0; i <10000;i++) {

           intnum1=(int)Math.sqrt(i+100);//開方,值已固定了

           intnum2=(int)Math.sqrt(i+268);

           if ((num1*num1==(i+100))&&(num2*num2==(i+268))) {//符合條件的打印出來

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

           }

       }

    }

}

 


【程式14】

題目:輸入某年某月某日,判斷這一天是這一年的第幾天?

     程式分析:以3月5日為例,應該先把前兩個月的加起來

     ,然後再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大於3時需考慮多加一天。

      閏年的條件:year除以400能整除,或者year除以4能整除,但是不能是100的倍數

   public class Programme14 {

    public static void main(String[] args) {

       System.out.println("請輸入年月日(用空格隔開):");

       Scanner scanner=new Scanner(System.in);

       int year=scanner.nextInt();//獲取年份

       int month=scanner.nextInt();//獲取月份

       int day=scanner.nextInt();//獲取天數

       int sum=0;//天數總和

       //建立一個包含月份天數的陣列,先按小年計算,如果是閏年,並且在三月以後再加1

       int[] arr={31,28,31,30,31,30,31,31,30,31,30,31};

       sum=day;//輸入的天數肯定是要加的

       for (inti = 1; i < month; i++) {  //加上包含的月份天數

           sum+=arr[i];

       }

       //最後判斷是否是閏年,如果是的話再加1,否則sum就是結果了,條件比較長,我就抽出來寫了

       booleanisRight=(((year%4==0)&&(year%100!=0))||(year%400==0))&&(month>2);

       if (isRight) {

           sum+=1;

       }

       System.out.println(year+""+month+""+day+"日,是這年的第"+sum+"");

    }

}

 

 

 


【程式15】

題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。

程式分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。

最後兩個數也使z>y就可以了 

public class Programme15 {

    public static void main(String[] args) {

       System.out.println("三個整數:");

       Scanner scanner=new Scanner(System.in);

       int num1=scanner.nextInt();//獲取整數

       int num2=scanner.nextInt();

       int num3=scanner.nextInt();

       int temp=0;//最為一個交換數

       if (num1>num2) {//保證num2>num1

           temp=num1;

           num1=num2;

           num2=temp;

       }

       if (num1>num3) {//保證num3>num1

           temp=num1;

           num1=num3;

           num3=temp;

       }

       if (num2>num3) {//保證num3>num2

           temp=num2;

           num2=num3;

           num3=temp;

       }

       System.out.println("這三個數從小到大排列:"+num1+"  "+num2+"  "+num3);

       scanner.close();

    }

}

 

 


【程式16】

題目:輸出9*9口訣。

程式分析:分行與列考慮,共9行9列,i控制行,jC列。

表示式:  i+"*"+j+"="+i*j,這裡要用兩個for迴圈控制輸出和換行

public class Programme16 {

    public static void main(String[] args) {

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

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

              System.out.print(i+"*"+j+"="+i*j+" ");//輸出結果

           }

           System.out.println();//換行

       }

    }

}

 


【程式17】

題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。

程式分析:採取逆向思維的方法,從後往前推斷。

   天  數      1   2    3    4   5    。。。10

桃子數     1    4   10   22   46          ?

      *   所以桃子數計算方法:前一天桃子數*2+2

public class Programme17 {

    public static void main(String[] args) {

       int sum=1;//第一天桃子的數量

       for (inti =2; i <=10;i++