1. 程式人生 > >java邏輯程式設計題

java邏輯程式設計題

以下程式分析是老師給出的提示,解答思路是自己的思考

1、題目:有一對兔子,從出生後第三個月起每個月都升一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少

解答思路:兔子狀態分為newBorn(新生),oneM(一個月之後),adult(成年),這裡分別對應一、二、三個月

                    第一個月總數為1對,考慮接下來的幾個月,變化情況為newBorn->oneM,oneM->adult,而adult會產生newBorn,有幾隻adult就會產生幾隻newBorn

                    這裡為了避免賦值出現問題,我們把表示式順序倒過來

,否則newBorn->oneM->adult,他們的值都一樣了。

                    兔子的總數=原總數+新生數

程式碼:

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之間有多少個素數,並輸出所有素數。

程式分析:判斷素數的方法:用一個數分別去除2sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。

注:這裡為什麼是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)+" ");
        }
    }
}

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

解題思路:求出百位、十位、個位是多少,分別平方後與原數比較

程式碼:

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