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();
}
}
}