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 Rabbit {
public static void main(String[] args) {
System.out.println("請輸入當前月是:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println("第"+n+"個月,共有兔子數是"+f(n));
sc.close();
}

private static int f(int n) {
if(n==1 || n==2)
return 1;
else
return f(n-1)+f(n-2);
}
}

 

【程序2】

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

程序分析:

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

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

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

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

public class 素數1 {//--------沒有判斷sqr,會多出結果多了兩個非素數121和169。
public static void main(String[] args) {
int sum=0;
for(int i=101;i<=200;i++){
if(f(i)){
System.out.print(i+" ");
sum++;
if(sum % 10 ==0){//十個一行
System.out.println();
}
}
}
System.out.println("素數的總個數是"+sum);
}
private static boolean f(int i){
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){//能整除非素數
return false;
}
}
return true;
}
}

 

public class 素數2 {
public static void main(String[] args) {
int sum=0;
for(int i=101;i<=200;i++){
if(f(i)){
System.out.print("素數是"+i+" ");
sum++;
if(sum%10==0){
System.out.println();
}
}
}
System.out.println("素數個數總共是"+sum);
}
private static boolean f(int i){
for(int j=2;j<=i-1;j++){
if(i%j==0)
return false;
}
return true;
}
}

 

程序3】

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

程序分析:利用for循環控制100-999個數,每個數分解出個位,十位,百位。

public class 水仙花數 {
public static void main(String[] args) {
int num=0;
System.out.print("100-900的水仙花數有:");
for(int i=100;i<=999;i++){
if(isShuiXian(i)){
System.out.print(i+" ");
num++;
}
// if(num%10==0){
// System.out.println();
// }
}
}

private static boolean isShuiXian(int i) {
int ge,shi,bai;
ge=i%10;
shi=i/10%10;
bai=i/100;
/*if(i==(ge^3+shi^3+bai^3)){
return true;
}*/
if(i==(ge*ge*ge+shi*shi*shi+bai*bai*bai)){
return true;
}
return false;
}
}

 

【程序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 分解質因數 {
public static void main(String[] args) {
System.out.print("請輸入一個要分解的數:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.print(n+"=");
for(int i=2;i<n+1;i++){
while(n%i==0&&n!=i){
n=n/i;
System.out.print(i+"*");
}
if(n==i){
System.out.print(i);
break;
}
}
sc.close();
}
}

 

程序5】

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

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

public class 條件嵌套1 {
public static void main(String[] args) {
System.out.print("請輸入你的分數:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s= n>90 ? "A" : (n>60 ? "B" : "C");
System.out.println("你的等級是:"+s);
}
}

 

程序6】

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

程序分析:利用輾除法。 

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

 *1、先求最大公約數bigDivisor

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

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

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

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

 *(3)循環上一步的操作,直到求余的結果為零

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

public class 最大公約數_最小公倍數 {
public static void main(String[] args) {
System.out.print("請輸入兩個整數:");
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();
int m = sc.nextInt();
int bigDivisor = 0 ;//最大公約數
int multiple = 0 ; //最小公倍數
multiple = n *m;
//int temp = 0;
int temp =1;//因為交換數下面要判斷所以不等於0和默認就可以
if(n>m){
temp=n%m;
n=m;
m=temp;
}
while(temp!=0){
temp=m%n;
m=n;
n=temp;
}
bigDivisor=m;//最后一次求余被除數就是最大公約數
multiple=multiple/bigDivisor;
System.out.println("最大公約數是:"+bigDivisor);
System.out.println("最小公倍數是:"+multiple);
sc.close();
}
}

 

【程序7】

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

  程序分析:

          這里的需要的知識點:

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

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

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

    4、char字符ASK碼的范圍

         (1)數字0到9: 48~57

         (2)字母A到Z:65到90 a到z:97到122

         (3)空格是32 

@SuppressWarnings("unchecked")
public class 統計各類字符個數 {
public static void main(String[] args) {
int english=0;
int blank=0;
int number=0;
int others=0;
System.out.println("請輸入要統計的字符串:");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char[] ch = str.toCharArray();
for(int i=0;i<ch.length;i++){
if(ch[i]>=48 && ch[i]<=57){
number++;
}else if((ch[i]>=65 && ch[i]<=90) || (ch[i]>=97 && ch[i] <=122)){
english++;
}else if(ch[i]==32){
blank++;
}else{
others++;
}
}
System.out.println("英文字母個數有:"+english);
System.out.println("空格字符個數有: "+blank);
System.out.println("數字個數有: "+number);
System.out.println("其它字符個數有: "+others);
}
}

 

【程序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次方)

 

import java.util.Scanner;

public class 遞增位數相加 {
public static void main(String[] args) {
System.out.println("請輸入一個數字a:");
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int n = sc.nextInt();
sum(a,n);
}

private static void sum(int a,int n) {
// TODO Auto-generated method stub
int temp=0;
int s = 0;
for(int i=1;i<=n;i++){
temp=a;
if(i==1){
a=temp;
}
else{
a=temp+a*(10^(i-1));//第i次的a大小
}
s+=a;
}
System.out.println(s);
}
}

public class 遞增位數相加2 {
public static void main(String[] args) {
int n=0,a=0;
Scanner sc = new Scanner(System.in);
System.out.println("請輸入a的值:");
a=sc.nextInt();
System.out.println("請輸入n的值:");
n=sc.nextInt();
int[] arr = new int[n];//創建輸出長度為n
int i=1;
arr[0]=a;//數組第一個數值
//把每一項的值放到數組里
while(i<n){
a*=10;
arr[i]=a+arr[i-1];
i++;
}
//求和
int sum=0;
for(int s:arr){
sum+=s;
if(s==arr[n-1]){
System.out.println(s);
break;//最后一次輸出結果
}
System.out.println(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 完數 {
public static void main(String[] args) {
System.out.println("1000以內的因數有:");
for(int i=1;i<=1000;i++){
int sum=0;
for(int j=1;j<i/2+1;j++){
if(i%j==0){
sum+=j;
if(i==sum){
System.out.print(i+" ");
}
}
}
}
}
}

 

public class 完數 {
public static void main(String[] args) {
System.out.println("請輸入一個整數:");
Scanner sc =new Scanner(System.in);
int n = sc.nextInt();
System.out.println("完數有:");
for(int i=1;i<=n;i++){
int sum=0;
for(int j=1;j<i/2+1;j++){
if(i%j==0){
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 小球反彈 {
public static void main(String[] args) {
System.out.println("請輸入小球下路的高度和落地的次數:");
Scanner sc = new Scanner(System.in);
float h = sc.nextFloat();
int n = sc.nextInt();

float sum=h;//經過路勁總和
h/=2;//第一次下路是在最高點,sum中嗎不會有兩倍h,所以從第二次開始循環且在循環外面
for(int i=2;i<=n;i++){
sum+=h*2;
h/=2;
}
System.out.println("在第"+n+"次下落,經過路程為"+sum);
sc.close();

}
}

 

【程序11】

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

程序分析:可填在百位、十位、個位的數字都是1、2、3、4。這里要用3個for循環

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

public class 不重復的三位數 {
public static void main(String[] args) {
int count=0;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
for(int k=1;k<=4;k++){
if((i != j ) && (i != k ) && (j != k)){
count++;
System.out.print(i+""+j+""+k+" ");
while(count%10==0){
System.out.println();
break;
}
}
}
}
}
System.out.println("\n共有這樣的輸"+count+"個");//\n換行
}
}

【程序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 利潤提成 {
public static void main(String[] args) {
System.out.println("請輸入你創造的利潤(單位:萬元)");
Scanner sc = new Scanner(System.in);
while(!sc.hasNextDouble()){
System.out.println("請輸入金額數字:");
sc.next();
}
double profit = sc.nextDouble();
double bonus=0;
if(profit<=10){
bonus=profit*0.1;
}else if(profit <=20){
bonus=(profit-10)*0.75+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+"萬元");
sc.close();
}
}

【程序13】

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

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

     用for循環判斷:先將該數加上100后再開方,再將該數加上268后再開方,

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

public class 是否平方 {
public static void main(String[] args) {
for(int i=0;i<=10000;i++){
int num1=(int)Math.sqrt(i+100);//強轉的話可能失去精度,利用這點完成本題
int num2=(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 本月的第幾天 {
public static void main(String[] args) {
System.out.println("請輸入年月日(用空格隔開): ");
Scanner sc = new Scanner(System.in);
int year= sc.nextInt(); //獲取年份
int month=sc.nextInt(); //獲取月份
int day = sc.nextInt();//獲取天數
int sum = 0;
int[] arr = {31,28,31,30,31,30,31,31,30,31,30,31};
sum=day;
for(int i=1;i<month;i++){
sum+=arr[i];
}
boolean isRight=(((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 三數比較大小 {
public static void main(String[] args) {
System.out.println("請輸入三個數 x,y,z:");
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();

int temp = 0;
if(x>y){//保證y>x
temp=x;
x=y;
y=temp;
}
if(x>z){//保證z>x
temp=x;
x=z;
z=temp;
}
if(y>z){//保證z>y
temp=y;
y=z;
z=temp;
}
System.out.println("輸入的三個數由小到大:"+x+" "+y+" "+z);
}
}

【程序16】

題目:輸出9*9口訣。

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

表達式:  i+"*"+j+"="+i*j,這里要用兩個for循環控制輸出和換行

public class 九九乘法 {
public static void main(String[] args) {
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j+" ");
}
System.out.println();
}
}
}

程序17】

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

程序分析:采取逆向思維的方法,從后往前推斷。

   天  數      1   2    3    4   5    。。。10

桃子數     1    4   10   22   46          ?

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

public class 猴子吃桃 {
public static void main(String[] args) {
int sum=1;
for(int i=2;i<=10;i++){
sum=sum*2+2;
}
System.out.println("猴子一共摘了桃子數為:"+sum);
}
}

【程序18】

題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。

程序分析:???感覺不能下手! 

      * 這道題目使用的是構造方法,還有arrayList的知識!標准答案的答案!

      * 但是,還是被我用for循環給解決了

   * 這里重要的是使用賦值,還有充分使用給出的條件,還有一個就是互不沖突的常識,比如第一個if的使用!

 

【程序19】

題目:打印出如下圖案(菱形)

   *

   ***

 ******

********

 ******

  ***

   *

程序分析:先把圖形分成兩部分來看待,前四行一個規律,后三行一個規律,

               利用雙重 for循環,第一層控制行,第二層控制列。

     詳細分析第一部分圖形的規律:1、這是一個等腰三角形,*的打印次數1、3、5、7等差數列

                                2、還要注意空格打印的 次數3、2、1、0逐漸遞減

      * 第二部分同理可得!   

public class 菱形 {
public static void main(String[] args) {
//分兩部分打印
//上半部分
for(int i=1;i<=4;i++){
for(int j=5-i;j>0;j--){
System.out.print(" ");
}
for(int k=1;k<=2*i-1;k++){
System.out.print("*");
}
System.out.println();
}
//下半部分
for(int i=3;i>0;i--){
for(int j=1;j<3-i+1;j++){
System.out.print(" ");
}
for(int k=1;k<2*i;k++){
System.out.print("*");
}
System.out.println();
}
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM