50道JAVA基礎(chǔ)編程練習(xí)題
【程序1】
題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數(shù)為多少?
程序分析: 兔子的規(guī)律為數(shù)列1,1,2,3,5,8,13,21....
public class Prog1{
?????? public? static void main(String[] args){
????????????? int? n = 10;
????????????? System.out.println("第"+n+"個月兔子總數(shù)為"+fun(n));
?????? }
?????? private? static int fun(int n){
????????????? if(n==1? || n==2)
????????????? ?? return 1;
????????????? else
????????????? ?? return fun(n-1)+fun(n-2);
?????? }
}
【程序2】
題目:判斷101-200之間有多少個素數(shù),并輸出所有素數(shù)。
程序分析:判斷素數(shù)的方法:用一個數(shù)分別去除2到sqrt(這個數(shù)),如果能被整除,則表明此數(shù)不是素數(shù),反之是素數(shù)。
public class? Prog2{
??? public static void main(String[] args){
??????? int m = 1;
??????? int n = 1000;
??????? int count = 0;
??????? //統(tǒng)計素數(shù)個數(shù)
??????? for(int i=m;i
??????????? if(isPrime(i)){
??????????????? count++;
??????????????? System.out.print(i+"? ");
??????????????? if(count%10==0){
??????????????????? System.out.println();
??????????????? }
??????????? }
??????? }
??????? System.out.println();
??????? System.out.println("在"+m+"和"+n+"之間共有"+count+"個素數(shù)");
??? }
??? //判斷素數(shù)
??? private static boolean isPrime(int n){
??????? boolean flag = true;
??????? if(n==1)
? flag = false;
??????? else{
??????????? for(int? i=2;i<=Math.sqrt(n);i++){
??????????? if((n%i)==0 || n==1){
??????????????? flag = false;
??????????????? break;
??????????? }
??????????? ?else
? flag = true;
? }
??????? }
??????? return flag;
??? }
}
【程序3】
題目:打印出所有的"水仙花數(shù)",所謂"水仙花數(shù)"是指一個三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如:153是一個"水仙花數(shù)",因為153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循環(huán)控制100-999個數(shù),每個數(shù)分解出個位,十位,百位。
public class? Prog3{
??? public static void main(String[] args){
??????? for(int i=100;i<1000;i++){
??????????? if(isLotus(i))
? System.out.print(i+" ");
??????? }
??????? System.out.println();
??? }
??? //判斷水仙花數(shù)
??? private static boolean isLotus(int lotus){
??????? int m = 0;
??????? int n = lotus;
??????? int sum = 0;
??????? m = n/100;
??????? n?
? -= m*100;
??????? sum = m*m*m;
??????? m = n/10;
??????? n -= m*10;
??????? sum += m*m*m + n*n*n;
??????? if(sum==lotus)
??????????? return true;
??????? else
??????????? return false;
??????? }
}
【程序4】
題目:將一個正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5。
程序分析:對n進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個最小的質(zhì)數(shù)k,然后按下述步驟完成:
(1)如果這個質(zhì)數(shù)恰等于n,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可。
(2)如果n<>k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)n,重復(fù)執(zhí)行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。
public class? Prog4{
??? public static void main(String[] args){
??????? int n = 13;
??????? decompose(n);
??? }
??? private static void decompose(int n){
??????? System.out.print(n+"=");
??????? for(int i=2;i
??????????? while(n%i==0 && n!=i){
??????????????? n/=i;
??????????????? System.out.print(i+"*");
??????????? }
??????????? if(n==i){
??????????????? System.out.println(i);
??????????????? break;
??????????? }
??????? }
??? }
}
【程序5】
題目:利用條件運算符的嵌套來完成此題:學(xué)習(xí)成績>=90分的同學(xué)用A表示,60-89分之間的用B表示,60分以下的用C表示。
程序分析:(a>b)?a:b這是條件運算符的基本例子。
public class Prog5{
?????? public? static void main(String[] args){
????????????? int? n = -1;
????????????? try{
???????????????????? n? = Integer.parseInt(args[0]);
????????????? }catch(ArrayIndexOutOfBoundsException? e){
???????????????????? System.out.println("請輸入成績");
???????????????????? return;
????????????? }
????????????? grade(n);
?????? }
?????? //成績等級計算
?????? private? static void grade(int n){
????????????? if(n>100? || n<0)
????????????? ? System.out.println("輸入無效");
????????????? else{
????????????? ? String str = (n>=90)?"分,屬于A等":((n>60)?"分,屬于B等":"分,屬于C等");
????????????? ? System.out.println(n+str);
????????????? }
?????? }
}
【程序6】
題目:輸入兩個正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。
程序分析:利用輾除法。
public class? Prog6{
??? public static void main(String[] args){
??????? int m,n;
??????? try{
??????????? m = Integer.parseInt(args[0]);
??????????? n = Integer.parseInt(args[1]);
??????? }catch(ArrayIndexOutOfBoundsException? e){
??????????? System.out.println("輸入有誤");
??????????? return;
??????? }
??????? max_min(m,n);
??? }
??? //求最大公約數(shù)和最小公倍數(shù)
??? private static void max_min(int m, int n){
??????? int temp = 1;
??????? int yshu = 1;
??????? int bshu = m*n;
??????? if(n
??????????? temp = n;
??????????? n = m;
??????????? m = temp;
??????? }
??????? while(m!=0){
??????????? temp = n%m;
??????????? n = m;
??????????? m = temp;
??????? }
??????? yshu = n;
??????? bshu /= n;
??????? System.out.println(m+"和"+n+"的最大公約數(shù)為"+yshu);
??????? System.out.println(m+"和"+n+"的最小公倍數(shù)為"+bshu);
??? }
}
【程序7】
題目:輸入一行字符,分別統(tǒng)計出其中英文字母、空格、數(shù)字和其它字符的個數(shù)。
程序分析:利用while語句,條件為輸入的字符不為'\n'.
import? java.util.Scanner;
public class? Prog7_1{
??? public static void main(String[] args){
??????? System.out.print("請輸入一串字符:");
??????? Scanner scan = new Scanner(System.in);
??????? String str = scan.nextLine();//將一行字符轉(zhuǎn)化為字符串
??????? scan.close();
??????? count(str);
??? }
??? //統(tǒng)計輸入的字符數(shù)
??? private static void count(String str){
??????? String E1 =? "[\u4e00-\u9fa5]";//漢字
??????? String E2 = "[a-zA-Z]";
??????? String E3 = "[0-9]";
??????? String E4 = "\\s";//空格
??????? int countChinese = 0;
??????? int countLetter = 0;
??????? int countNumber = 0;
??????? int countSpace = 0;
??????? int countOther = 0;
??????? char[] array_Char =? str.toCharArray();//將字符串轉(zhuǎn)化為字符數(shù)組
??????? String[] array_String = new? String[array_Char.length];//漢字只能作為字符串處理
??????? for(int? i=0;i
? array_String[i] = String.valueOf(array_Char[i]);
??????? //遍歷字符串?dāng)?shù)組中的元素
??????? for(String s:array_String){
??????????? if(s.matches(E1))
? countChinese++;
??????????? else if(s.matches(E2))
? countLetter++;
??????????? else if(s.matches(E3))
? countNumber++;
??????????? else if(s.matches(E4))
? countSpace++;
??????????? else
? countOther++;
??????? }
??????? System.out.println("輸入的漢字個數(shù):"+countChinese);
??????? System.out.println("輸入的字母個數(shù):"+countLetter);
??????? System.out.println("輸入的數(shù)字個數(shù):"+countNumber);
??????? System.out.println("輸入的空格個數(shù):"+countSpace);
??????? System.out.println("輸入的其它字符個數(shù):"+countSpace);
??? }
}
import? java.util.*;
public class? Prog7_2{
??? public static void main(String[] args){
? System.out.println("請輸入一行字符:");
? Scanner scan = new Scanner(System.in);
? String str = scan.nextLine();
? scan.close();
? count(str);
??? }
??? //統(tǒng)計輸入的字符
??? private static void count(String str){
??????? List list = new? ArrayList();
??????? char[] array_Char = str.toCharArray();
??????? for(char c:array_Char)
? list.add(String.valueOf(c));//將字符作為字符串添加到list表中
??????? Collections.sort(list);//排序
??????? for(String s:list){
??????????? int begin = list.indexOf(s);
??????????? int end = list.lastIndexOf(s);
??????????? //索引結(jié)束統(tǒng)計字符數(shù)
??????????? if(list.get(end)==s)
? System.out.println("字符‘"+s+"’有"+(end-begin+1)+"個");
??????? }
??? }
}
【程序8】
題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數(shù)字。例如2+22+222+2222+22222(此時共有5個數(shù)相加),幾個數(shù)相加有鍵盤控制。
程序分析:關(guān)鍵是計算出每一項的值。
import? java.util.Scanner;
public class? Prog8{
??? public static void main(String[] args){
??????? System.out.print("求s=a+aa+aaa+aaaa+...的值,請輸入a的值:");
??????? Scanner scan = new? Scanner(System.in).useDelimiter("\\s*");//以空格作為分隔符
??????? int a = scan.nextInt();
??????? int n = scan.nextInt();
??????? scan.close();//關(guān)閉掃描器
??????? System.out.println(expressed(2,5)+add(2,5));
??? }
??? //求和表達(dá)式
??? private static String expressed(int a,int? n){
??????? StringBuffer sb = new StringBuffer();
??????? StringBuffer subSB = new? StringBuffer();
??????? for(int i=1;i
? subSB = subSB.append(a);
? sb = sb.append(subSB);
? if(i
? sb = sb.append("+");
??????? }
??????? sb.append("=");
??????? return sb.toString();
??? }
??? //求和
??? private static long add(int a,int n){
??????? long sum = 0;
??????? long subSUM = 0;
??????? for(int i=1;i
??????????? subSUM = subSUM*10+a;
??????????? sum = sum+subSUM;
??????? }
??????? return sum;
??? }
}
【程序9】
題目:一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為"完數(shù)"。例如6=1+2+3.編程找出1000以內(nèi)的所有完數(shù)。
public class? Prog9{
??? public static void main(String[] args){
??????? int n = 10000;
??????? compNumber(n);
??? }
??? //求完數(shù)
??? private static void compNumber(int n){
??????? int count = 0;
??????? System.out.println(n+"以內(nèi)的完數(shù):");
??????? for(int i=1;i
??????????? int sum = 0;
??????????? for(int j=1;j
??????????????? if((i%j)==0){
??????????????????? sum += j;
??????????????????? if(sum==i){
??????????????? ? System.out.print(i+" ");
??????????????? ? if((count++)%5==0)
??????????????? ??? System.out.println();
? }
??????????????? }
??????????? }
??????? }
??? }
}
【程序10】
題目:一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地時,共經(jīng)過多少米?第10次反彈多高?
import? java.util.Scanner;
public class? Prog10{
??? public static void main(String[] args){
??????? System.out.print("請輸入小球落地時的高度和求解的次數(shù):");
??????? Scanner scan = new? Scanner(System.in).useDelimiter("\\s");
??????? int h = scan.nextInt();
??????? int n = scan.nextInt();
??????? scan.close();
??????? distance(h,n);
??? }
??? //小球從h高度落下,經(jīng)n次反彈后經(jīng)過的距離和反彈的高度
??? private static void distance(int h,int n){
??????? double length = 0;
??????? for(int i=0;i
??????????? length += h;
??????????? h /=2.0 ;
??????? }
??????? System.out.println("經(jīng)過第"+n+"次反彈后,小球共經(jīng)過"+length+"米,"+"第"+n+"次反彈高度為"+h+"米");
??? }
}
【程序11】
題目:有1、2、3、4個數(shù)字,能組成多少個互不相同且無重復(fù)數(shù)字的三位數(shù)?都是多少?
程序分析:可填在百位、十位、個位的數(shù)字都是1、2、3、4。組成所有的排列后再去 掉不滿足條件的排列。
public class? Prog11{
??? public static void main(String[] args){
??????? int count = 0;
??????? int n = 0;
??????? for(int i=1;i<5;i++){
??????????? for(int j=1;j<5;j++){
??????????????? if(j==i)
??????????????? ? continue;
??????????????? for(int k=1;k<5;k++){
??????????????????? if(k!=i && k!=j){
??????????????????????? n = i*100+j*10+k;
??????????????????? ? System.out.print(n+" ");
??????????????????? ? if((++count)%5==0)
??????????????????? ? System.out.println();
??????????????????? }
??????????????? }
??????????? }
??????? }
??????? System.out.println();
??????? System.out.println("符合條件的數(shù)共:"+count+"個");
??? }
}
【程序12】
題目:企業(yè)發(fā)放的獎金根據(jù)利潤提成。利潤(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%提成,從鍵盤輸入當(dāng)月利潤I,求應(yīng)發(fā)放獎金總數(shù)?
程序分析:請利用數(shù)軸來分界,定位。注意定義時需把獎金定義成長整型。
import java.io.*;
public class Prog12{
??? public? static void main(String[] args){
??????? System.out.print("請輸入當(dāng)前利潤:");
??????? long? profit = Long.parseLong(key_Input());
??????? System.out.println("應(yīng)發(fā)獎金:"+bonus(profit));
??? }
??? //接受從鍵盤輸入的內(nèi)容
??? private? static String key_Input(){
??????? String? str = null;
??????? BufferedReader? bufIn = new BufferedReader(new InputStreamReader(System.in));
??????? try{
??????????? str? = bufIn.readLine();
??????? }catch(IOException? e){
??????????? e.printStackTrace();
??????? }finally{
??????????? try{
??????????????? bufIn.close();
??????????? }catch(IOException? e){
??????????????? e.printStackTrace();
??????????? }
??????? }
??????? return? str;
??? }
??? //計算獎金
??? private? static long bonus(long profit){
??????? long prize = 0;
??????? long? profit_sub = profit;
??????? if(profit>1000000){
??????????? profit? = profit_sub-1000000;
??????????? profit_sub? = 1000000;
??????????? prize? += profit*0.01;
??????? }
??????? if(profit>600000){
??????????? profit? = profit_sub-600000;
??????????? profit_sub? = 600000;
??????????? prize? += profit*0.015;
??????? }
??????? if(profit>400000){
??????????? profit? = profit_sub-400000;
??????????? profit_sub? = 400000;
??????????? prize? += profit*0.03;
??????? }
??????? if(profit>200000){
??????????? profit? = profit_sub-200000;
??????????? profit_sub? = 200000;
??????????? prize? += prize*0.05;
??????? }
??????? if(profit>100000){
??????????? profit? = profit_sub-100000;
??????????? profit_sub? = 100000;
??????????? prize? += profit*0.075;
??????? }
??????? prize? += profit_sub*0.1;
??????? return? prize;
??? }
}
【程序13】
題目:一個整數(shù),它加上100后是一個完全平方數(shù),再加上168又是一個完全平方數(shù),請問該數(shù)是多少?
程序分析:在10萬以內(nèi)判斷,先將該數(shù)加上100后再開方,再將該數(shù)加上268后再開方,如果開方后的結(jié)果滿足如下條件,即是結(jié)果。
public class? Prog13{
??? public static void main(String[] args){
??????? int n=0;
??????? for(int i=0;i<100001;i++){
??????????? if(isCompSqrt(i+100) &&? isCompSqrt(i+268)){
??????????????? n = i;
??????????????? break;
??????????? }
??????? }
??????? System.out.println("所求的數(shù)是:"+n);
??? }
??? //判斷完全平方數(shù)
??? private static boolean isCompSqrt(int n){
??????? boolean isComp = false;
??????? for(int i=1;i
??????????? if(n==Math.pow(i,2)){
??????????????? isComp = true;
??????????????? break;
??????????? }
??????? }
??????? return isComp;
??? }
}
【程序14】
題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
程序分析:以3月5日為例,應(yīng)該先把前兩個月的加起來,然后再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大于3時需考慮多加一天。
import? java.util.Scanner;
public class? Prog14{
??? public static void main(String[] args){
??????? Scanner scan = new Scanner(System.in).useDelimiter("\\D");//匹配非數(shù)字
??????? System.out.print("請輸入當(dāng)前日期(年-月-日):");
??????? int year = scan.nextInt();
??????? int month = scan.nextInt();
??????? int date = scan.nextInt();
??????? scan.close();
??????? System.out.println("今天是"+year+"年的第"+analysis(year,month,date)+"天");
??? }
??? //判斷天數(shù)
??? private static int analysis(int year, int? month, int date){
??????? int n = 0;
??????? int[] month_date = new int[]? {0,31,28,31,30,31,30,31,31,30,31,30};
??????? if((year%400)==0 ||? ((year%4)==0)&&((year%100)!=0))
? month_date[2] = 29;
??????? for(int i=0;i
? n += month_date[i];
??????? return n+date;
??? }
}
【程序15】
題目:輸入三個整數(shù)x,y,z,請把這三個數(shù)由小到大輸出。
程序分析:我們想辦法把最小的數(shù)放到x上,先將x與y進(jìn)行比較,如果x>y則將x與y的值進(jìn)行交換,然后再用x與z進(jìn)行比較,如果x>z則將x與z的值進(jìn)行交換,這樣能使x最小。
import? java.util.Scanner;
public class? Prog15{
??? public static void main(String[] args){
??????? Scanner scan = new? Scanner(System.in).useDelimiter("\\D");
??????? System.out.print("請輸入三個數(shù):");
??????? int x = scan.nextInt();
??????? int y = scan.nextInt();
??????? int z = scan.nextInt();
??????? scan.close();
??????? System.out.println("排序結(jié)果:"+sort(x,y,z));
??? }
??? //比較兩個數(shù)的大小
??? private static String sort(int x,int y,int? z){
??????? String s = null;
??????? if(x>y){
??????????? int t = x;
??????????? x = y;
??????????? y = t;
??????? }
??????? if(x>z){
??????????? int t = x;
??????????? x = z;
??????????? z = t;
??????? }
??????? if(y>z){
??????????? int t = z;
??????????? z = y;
??????????? y = t;
??????? }
??????? s = x+" "+y+" "+z;
??????? return s;
??? }
}
【程序16】
題目:輸出9*9口訣。
程序分析:分行與列考慮,共9行9列,i控制行,j控制列。
public class Prog16{
??? public static void main(String[] args){
??????? for(int i=1;i<10;i++){
??????????? for(int j=1;j
??????????????? System.out.print(j+"*"+i+"="+(j*i)+"? ");
??????????? System.out.println();
??????? }
??? }
}
【程序17】
題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當(dāng)即吃了一半,還不癮,又多吃了一個第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
程序分析:采取逆向思維的方法,從后往前推斷。
public class? Prog17{
??? public static void main(String[] args){
??????? int m = 1;
? for(int i=10;i>0;i--)
? m = 2*m + 2;
? System.out.println("小猴子共摘了"+m+"桃子");
??? }
}
【程序18】
題目:兩個乒乓球隊進(jìn)行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。
import? java.util.ArrayList;
public class? Prog18{
??? String a,b,c;//甲隊成員
??? public static void main(String[] args){
??????? String[] racer =? {"x","y","z"};//乙隊成員
??????? ArrayList arrayList =? new ArrayList();
??????? for(int i=0;i<3;i++)
? for(int j=0;j<3;j++)
? for(int k=0;k<3;k++){
? ??? Prog18 prog18 = new? Prog18(racer[i],racer[j],racer[k]);
? ??? if(!prog18.a.equals(prog18.b)? && !prog18.a.equals(prog18.c) && !prog18.b.equals(prog18.c)? &&
? ??? ???!prog18.a.equals("x") &&? !prog18.c.equals("x") && !prog18.c.equals("z"))
? ??? ???arrayList.add(prog18);
? }
? for(Object obj:arrayList)
? System.out.println(obj);
??? }
??? //構(gòu)造方法
??? private Prog18(String a,String b,String? c){
??????? this.a = a;
??????? this.b = b ;
??????? this.c = c;
??? }
??? public String toString(){
??????? return "a的對手是"+a+"? "+"b的對手是"+b+"? "+"c的對手是"+c;
??? }
}
【程序19】
題目:打印出如下圖案(菱形)
*
***
******
********
******
***
*
程序分析:先把圖形分成兩部分來看待,前四行一個規(guī)律,后三行一個規(guī)律,利用雙重 for循環(huán),第一層控制行,第二層控制列。
public class? Prog19{
??? public static void main(String[] args){
??????? int n = 5;
??????? printStar(n);
??? }
??? //打印星星
??? private static void printStar(int n){
??????? //打印上半部分
??????? for(int i=0;i
??????????? for(int j=0;j<2*n;j++){
? ? if(j
? ? ??System.out.print(" ");
? ? if(j>=n-i &&? j<=n+i)
? ? ??System.out.print("*");
? }
? System.out.println();
??????? }
??????? //打印下半部分
??????? for(int i=1;i
??????????? System.out.print(" ");
??????????? for(int j=0;j<2*n-i;j++){
??????????????? if(j
? ? ??System.out.print(" ");
? ? if(j>=i &&? j<2*n-i-1)
? ? ??System.out.print("*");
??????????? }
??????????? System.out.println();
??????? }
??? }
}
【程序20】
題目:有一分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數(shù)列的前20項之和。
程序分析:請抓住分子與分母的變化規(guī)律。
public class? Prog20{
??? public static void main(String[] args){
??????? double n1 = 1;
??????? double n2 = 1;
??????? double fraction = n1/n2;
??????? double Sn = 0;
??????? for(int i=0;i<20;i++){
? double t1 = n1;
? double t2 = n2;
? n1 = t1+t2;
? n2 = t1;
? fraction = n1/n2;
? Sn += fraction;
??????? }
??????? System.out.print(Sn);
??? }
}