java邏輯程式設計題
以下程式分析是老師給出的提示,解答思路是自己的思考
1、題目:有一對兔子,從出生後第三個月起每個月都升一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少
解答思路:兔子狀態分為newBorn(新生),oneM(一個月之後),adult(成年),這裡分別對應第一、二、三個月
第一個月總數為1對,考慮接下來的幾個月,變化情況為newBorn->oneM,oneM->adult,而adult會產生newBorn,有幾隻adult就會產生幾隻newBorn
這裡為了避免賦值出現問題,我們把表示式順序倒過來
兔子的總數=原總數+新生數
程式碼:
import java.util.*;
public class Rabbit{
public static void main(String[]args){
int sum=1;
int adult=0;
int newBorn=1;
int oneM=0;
System.out.print("how many month later:");
Scanner x=new Scanner(System.in);
int time=x.nextInt();
System.out.println("最初兔子總數為:"+sum+"對");
for(int t=1;t<=time;t++){
adult=adult+oneM;
//System.out.println("adult="+adult);
oneM=newBorn;
//System.out.println("oneM="+oneM);
newBorn=adult;
//System.out.println("newBorn"+newBorn);
sum=sum+newBorn;
System.out.println(t+"月之後,兔子總數為:"+sum+"對");
}
}
}
2.題目:判斷101-200之間有多少個素數,並輸出所有素數。
程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。
注:這裡為什麼是2到sqrt(這個數),因為如果這個數==n*n,如果不能被小於n的數整除,那麼肯定也不能被大於n的數整除,因為如果這個數用兩個數相乘表示,肯定有一個大於n,一個小於n
程式碼:
import java.util.*;
//匯入使用sqrt的包
import static java.lang.Math.*;
public class Prime{
public static void main(String[] args){
//區域性變數一定要注意它的作用域
ArrayList<Integer>list=new ArrayList<Integer>();
for(int target=101;target<201;target++){
//這裡的j,用boolen值更好
int i=2,j=0;
int sq=(int)sqrt(target);
for(i=2;i<sq;i++){
//這裡是target對i取餘,不是sq
if(target%i==0){
j=1;
break;
}
}
if(j!=1){
list.add(target);
}
}
for(int m=0;m<list.size();m++){
System.out.print(list.get(m)+" ");
}
}
}
解題思路:求出百位、十位、個位是多少,分別平方後與原數比較
程式碼:
import java.lang.Math.*;
public class Narcissistic{
public static void main(String [] args){
for(int num=100;num<1000;num++){
int hund=num/100;
int ten=(num%100)/10;
int unit=num%10;
if(Math.pow(hund,3)+Math.pow(ten,3)+Math.pow(unit,3)==num){
System.out.print(num+" ");
}
}
}
}
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的值,重複執行第一步。
易錯點:1)list的使用方法
2)while迴圈中k的增加
3)容易忘記list新增完k值之後需要新增n
4)list.get(),括號中數要小於list的長度,因為長度是從1開始,而list從0開始
import java.util.*;
public class Factor{
public static void main(String[]args){
System.out.print("請輸入需要分解質因數的數:");
Scanner x=new Scanner(System.in);
int n=x.nextInt();
int k=2;
ArrayList<Integer> factor=new ArrayList<Integer>();
while(k!=n){
if(n%k==0){
n=n/k;
factor.add(k);
}else k++;
}
factor.add(n);
int length=factor.size();
System.out.print("此數的因質數為:");
for(int i=0;i<(length-1);i++){
System.out.print(factor.get(i)+"*");
}
System.out.print(factor.get(length-1));
}
}
5.題目:利用條件運算子的巢狀來完成此題:學習成績> =90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示。
import java.util.*;
public class Grade {
public static void main(String[] args) {
int x;
char grade;
Scanner s = new Scanner(System.in);
System.out.print( "請輸入一個成績: ");
x = s.nextInt();
//三元運算子 (條件表示式)?表示式1:表示式2
//這裡是(條件表示式)?表示式1:(條件表示式)?表示式2:表示式3————巢狀的三元運算子
grade = x >= 90 ? 'A' : x >= 60 ? 'B':'C';
System.out.println("等級為:"+grade);
}
}