1. 程式人生 > >java經典程式程式設計知識(一)

java經典程式程式設計知識(一)

Scanner scanner=new Scanner(System.in)

Scanner是一個類,nextXxx()是Scanner的成員函式,System.in作為引數傳遞給Scanner的建構函式,使Scanner用鍵盤作為輸入,然後用new在記憶體中例項化一個Scanner出來,使得其它變數能呼叫這塊記憶體區。

next()與nextLine()讀取字串
next():

一定要讀取到有效字元後才可以結束輸入。
對輸入有效字元之前遇到的空白,next()方法會自動將其去掉。
next()不能得到帶有空格的字串。

nextLine():

以Enter為結束符,nextLine()方法返回的是輸入回車之前的所有字元,可以獲得空白。

while (scanner.hasNextDouble()) {//判斷輸入的是不是double,如果輸了別的按下enter後會終止
    double x = scanner.nextDouble();//讀取double型
}

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

    public static void main(String[] args) {
        int n=0;
        System.out.println("101-200間的素數有:");
        for(int i=101;i<=200;i++){
            if(isRight(i)){
                System.out.print(i+" ");
                n++;
                if(n%5==0){
                    System.out.println();
                }
            }            
        }
        System.out.println("共有"+n+"個素數");
    }
    private static boolean isRight(int n){
        for(int i=2;i<=Math.sqrt(n);i++){
            if(n%i==0){
                return false;
            }
        }
        return true;
    }
為什麼用Math.sqrt(m):

因為如果m能被2~m-1之間任一整數整除,其二個因子必定有一個小於或等於√m,另一個大於或等於√m。例如16能被2,4,8整除,16=28,2小於4,8大於4,16=44,4=√16,因此只需判定在2~4之間有無因子即可

long startTime=System.currentTimeMillis(); //獲取開始時間(毫秒)
doSomeThing(); //測試的程式碼段
long endTime=System.currentTimeMillis(); //獲取結束時間
long startTime=System.nanoTime(); //獲取開始時間(納秒)
水仙花數求法
    public static void main(String[] args) {
        int m,n,t;
        for(int i=100;i<1000;i++){
            m=i%10;
            n=i/10%10;
            t=i/100;
            if(i==(m*m*m)+(n*n*n)+(t*t*t)){
                System.out.print(i+" ");
            }
        }
    }

【程式4】
題目:將一個正整數分解質因數。例如:輸入90,打印出90=2 * 3 * 3 * 5。

public class Programme {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("請輸入一個正整數:");
        int n=scanner.nextInt();
        System.out.print(n+"=");
        for(int i=2;i<=n;i++){
            while(n%i==0&&i!=n){//當要除以4時前面除以2的時侯已經除完,達到了選出質數的效果
                System.out.print(i+"*");
                n=n/i;
            }
            if(n==i){
                System.out.println(i);
            }
        }
        scanner.close();
    }    
}
兩個數的最大公約數(Greatest Common Divisor)的求法
輾轉相除法

輾轉相除法也叫歐幾里得演算法,是一種非常古老的求解兩個數的最大公約數的演算法。其基於的原理:兩個正整數a和b(a > b),它們的最大公約數gcd等於a除以b的餘數r和b之間的最大公約數。比如,10和25的最大公約數5等於25除以10的餘數5和10的最大公約數;再比如51和21的最大公約數3等於51除以21的餘數9和21的最大公約數,而9和21的最大公約數為3。根據上面的原理,輾轉相除法的演算法流程可以如下:
步驟1:計算a與b的餘數r。
步驟2:如果r為0,則返回gcd = b。否則,轉到步驟3。
步驟3:使用b的值更新a的值,使用餘數r更新b的值,轉到步驟1。

long Gcd(long a,long b){
    return (a%b==0)?b:(Gcd(b,a%b));
}

等等,為什麼不對a和b的大小進行判斷呢?上面的演算法原理中不是要求a大於b嗎?如果呼叫時a值大於b值,比如a為51,b為21,那麼情況跟上述演算法原理是相符的。如果呼叫時a值小於b值,比如a為21,b為51,那麼,21除以51的餘數r為21,不為0,於是接著呼叫GetGCD(51, 21),看到了沒?這就和a > b的情況是一樣的了。也就是說我們根本無需判斷a和b的大小,當a值小於b值時,演算法的下一次遞迴呼叫就能夠將a和b的值交換過來。

最小公倍數=A*B/gcb

假設兩數為A,B,A=ca,B=cb;a,b互質(公約數只有1的兩個整數),gcb=c,最小公倍數肯定是abc=A*B/gcb。

凡是屬於IO流的類如果不關閉會一直佔用資源.要養成好習慣用完就關掉

boolean bool;//bool的值不是false

int[] arr=new int[n];//建立陣列

參考資料:https://blog.csdn.net/yzh372685776/article/details/51965436
https://www.cnblogs.com/laizhenghong2012/p/8457784.html



來自為知筆記(Wiz)