JAVA基礎50題

package package0530;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Logger;

/**
 * 本類主要用於練習java基礎,放鬆放鬆
 * @author xinxin
 */
public class FunctionClass {
    static Logger log = Logger.getLogger("FunctionClass");
    /*
     * 程序1:
     * 題目:古典問題:有一對兔子,從出生後第3個月起每月都生一對兔子,
     * 小兔子長到第三個月後每月又生一對 兔子,假如兔子都不死,
     * 問每月的兔子總數爲多少?
     */
    public static int test1(int n){
        //1 2 3 4 5 6 7  8  9
        //1 1 2 3 5 8 13 21 34
        int[] arr = new int[n+1];
        
        arr[0] = 0;
        arr[1] = 1;
        for(int i = 2;i<=n;i++){
            arr[i] = arr[i-2] + arr[i-1];
        }
        return arr[n]*2;
    }
    
    /*
     * 程序2:
     * 題目:判斷101-200之間有多少個素數,並輸出全部素數。
     */
    public static void test2(){
        for(int i = 101;i<=200;i++){
            boolean b = true;
            for(int j=2;j<i&&b;j++){
                if(i % j ==0){
                    b = false;
                }
            }
            if(b){
                System.out.println("素數:"+i);
            }
        }
    }
    
    /*
     * 程序3:
     * 題目:打印出全部的 "水仙花數 ",所謂 "水仙花數 "是指一個三位數,
     * 其各位數字立方和等於該數自己。
     * 例如:153是一個 "水仙花數 ",由於153=1的三次方+5的三次方+3的三次方。
     */
    public static void test3(){
        for(int i = 100;i<1000;i++){
            int b = i/100;
            int s = i%100/10;
            int g = i%10;
            if(i == b*b*b+s*s*s+g*g*g){
                System.out.println("我是水仙花數:"+i);
            }
        }
    }
    
    /*
     * 程序4:
     * 題目:將一個正整數分解質因式。例如:輸入90,打印出90=2*3*3*5;
     * 思路:先求這個正整數的全部的質數
     */
    public static void test4(int n){
        List<Integer> li1 = new ArrayList<Integer>();
        List<Integer> li2 = new ArrayList<Integer>();
        //求全部質數
        flag:for(int i=2;i<=n;i++){
            for(int j=2;j<i;j++){
                if(i%j==0){
                    continue flag;
                }
            }
            li1.add(i);
        }
        //求全部質因數
        for(Integer pn:li1){
            int num1 = n%pn;
            int num2 = n/pn;
            while(num1==0){
                li2.add(pn);
                num1 = num2%pn;
                num2 = num2/pn;
            }
        }
        //處理邏輯,拼接字符串
        StringBuilder sb = new StringBuilder();
        sb.append(n+"=");
        for(Integer pn:li2){
            sb.append(pn+"*");
        }
        sb.deleteCharAt(sb.length()-1);
        System.out.println(sb.toString());
    }
    
    /*
     * 程序4:更好的答案
     */
    public static void test4s(int n){
        int k = 1;
        System.out.println(n+"=");
        while(k<=n){
            if(k==n){
                System.out.println(n);
                break;
            }else if(n%k==0){
                System.out.print(k+"*");
                n = n/k;
            }else{
                k++;
            }
        }
    }
    
    /*
     * 程序5:
     * 利用條件運算符的嵌套來完成此題:學習成績 >=90分的同窗用A表示,
     * 60~89分之間用B表示,60分如下用C表示
     */
    public static void test5(double d){
        char c;
        c = d>90 ? 'A' : (d>=60) ? 'B' : 'C';
        System.out.println(c);
    }
    
    /*
     * 程序6:
     * 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
     * 最大公約數記法:(a,b)
     * 最小公倍數記法:[a,b]
     */
    public static void test6(int m,int n){
        int temp = n*m;
        int t = 0;
        while(m%n!=0){//展轉相除法
            t = n;
            n = m%n;
            m = t;
        }
        System.out.println("最大公約數:"+n);
        System.out.println("最小公倍數:"+temp/n);
    }
    
    /*
     * 程序7:
     * 題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。
     */
    public static void test7(String str){
        char[] ch = str.toCharArray();
        int blank = 0;
        int character = 0;
        int number=0;
        int other=0;
        for(int i = 0;i<ch.length;i++){
             if(ch[i] == ' '){
                blank++;
             }else if(('A'<=ch[i]&&ch[i]<='Z')||('a'<=ch[i]&&ch[i]<='z')){
                 character++;
             }else if('0'<=ch[i]&&ch[i]<='9'){
                 number++;
             }else{
                 other++;
             }
        }
        System.out.println("字符串爲:"+str);
        System.out.println("英文字符個數:"+character);
        System.out.println("空格的個數:"+blank);
        System.out.println("數字的個數"+number);
        System.out.println("其它字符的個數:"+other);
    }
    
    /*
     * 程序8:
     * 題目:求s = a + aa + aaa + aaaa +aa...a的值,其中a是一個數字。
     * 例如: 2 + 22 + 222 + 2222 + 22222(此時共有5個數字相加)
     *         幾個數相加有鍵盤控制。
     */
    /**
     *
     * @param a 至關於數字a
     * @param n 一共 有多少個數字相加
     */
    //2    3    2+22+222
    public static void test8(int a,int n){
        int temp = a,i=0,sum =0;
        while(i<n){
            sum = sum + temp;
            temp = temp*10+a;
            i++;
        }
        System.out.println("總和爲:"+sum);
    }
    
    /*
     * 程序9:
     * 題目:一個數若是剛好等於它的因子之和,這個數就稱爲「完數」。
     * 例如:6 = 1+2+3
     * 請找出1000之內的全部完數。
     */
    public static void test9(){
        List<Integer> arr;
        for(int i = 1;i<1000;i++){
            arr = new LinkedList<Integer>();
            for(int j=1;j<i;j++){
                if(i%j==0) arr.add(j);
            }
            int sum = 0;
            for(Integer in:arr){
                sum +=in;
            }
            if(sum==i)
                System.out.println("我是完數:"+i);
        }
    }
    
    /*
     * 程序10:
     * 題目:一個球從100米高度落下,每次落地後反跳回原高度一半;
     *        再落下,求他在第10次落地時,共通過多少米?第10次 反彈多高?
     */
    /*
     * 分析:
     * 第1次落地:共通過  100   米,反彈  50  米;
     * 第2次落地:共通過  200   米,反彈  25  米;
     * 第3次落地:共通過  250   米,反彈  25/2  米;
     * 第4次落地:共通過  275   米,反彈  25/2/2  米;
     * 第5次落地:共通過  287.5   米,反彈  25/2/2/2  米;
     */
    /**
     * @param n 第幾回落地
     */
    public static void test10(int n){
        double totalJournay = 100;
        double reboundHeight = 0;
        double initHeight = 100;
        int kk = 1;
        for(int i = 1;i<=n;i++){
             kk *=2;    
             totalJournay +=  2*reboundHeight;
             reboundHeight = initHeight/kk;
        }
        System.out.println("第"+n+"次落地,共通過"+totalJournay+"米  , 反彈高度爲"+reboundHeight);
    }
    
    /*
     * 程序11:
     * 題目:有1,2,3,4四個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
     */
    public static void test11(){
        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){
                        System.out.println(i*100+j*10+k);
                        count++;
                    }
                }
            }
        }
        System.out.println("count:"+count);
    }
    
    /*
     * 程序12:
     * 題目:企業發的獎金根據利潤提成。利潤低於或等於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%提成,從鍵盤輸入當月利潤,求應發放獎金總數?
     */
    public static void test12(){
        double salary = 0.0;  //獎金
        Scanner sc = new Scanner(System.in);
        Double d = sc.nextDouble();  //利潤
        if(d<0){
                try {
                    throw new Exception("你別輸入負數啊,朋友!");
                } catch (Exception e) {
                    System.err.println(e.getMessage());
                    return;
                }
        }
        if(d<=10){
            salary = d*0.1;
        }else if(d<20){
            salary = 10*0.1+(d-10)*0.075;
        }else if(d<40){
            salary = 10*0.1 + 10*0.075 + (d-20)*0.05;
        }else if(d<60){
            salary = 10*0.1 + 10*0.075 + 20*0.05 + (d-40)*0.03;
        }else if(d<100){
            salary = 10*0.1 + 10*0.075 + 20*0.05 + 20*0.03 + (d-60)*0.015;
        }else{
            salary = 10*0.1 + 10*0.075 + 20*0.05 + 20*0.03 + 40*0.015 +(d-100)*0.01;
        }
        DecimalFormat df = new DecimalFormat("#.0000");
        System.out.println("當月應發獎金總額爲"+df.format(salary)+"萬元!");
        System.out.println(String.format("%.4f", salary));
    }
    
    /*
     * 程序13:
     * 題目:一個整數,它加上100後是一個徹底平方數,再加上168又是一個徹底平方數,
     * 請問該數是多少?    
     */
    public static void test13(){
        int i = 0;
        while(true){//寫了一個死循環,看看後面怎麼跑的
            if(Math.sqrt(i+100)%1==0&&Math.sqrt(i+268)%1==0){
                System.out.println(i);
            }
            i++;//i--;也行
        }
    }
    
    /*
     * 程序14:
     * 題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
     */
    public static void test14(int year,int month,int day){
        int days = 0;
        int sum = 0;
        for(int i=1;i<month;i++){
            switch(i){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                days = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                days = 30;
                break;
            case 2:
                if((year%400)==0||(year%4==0&&year%100!=0)){
                    days = 29;
                }else{
                    days = 28;
                }
                break;
            }
            sum +=days;
        }
        System.out.println(year+"年"+month+"月"+day+"日   是這一年的第"+(day+sum)+"天!");
    }
    
    /*
     * 程序15:
     * 題目:輸入3個整數x,y,z,請把這三個數從小到大輸出。
     */
    public static void test15(int x,int y,int z){
        int[] arr = new int[]{x,y,z};
        /*選擇排序
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }*/
        //冒泡排序
        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    
    /*
     * 程序16:
     * 題目:輸出9*9乘法口訣。
     */
    public static void test16(){
        System.err.println("          9*9乘法口訣表");
        System.out.println();
        flag:for(int i=1;i<10;i++){
            for(int j=1;j<10;j++){
                if(i<j){
                    System.out.println();
                    continue flag;
                }
                System.out.print(i+"*"+j+"="+i*j+"\t");
            }
            
        }
    }
    //這種方法實現更方便
    public static void test16s(){
        for(int i = 1;i<10;i++){
            for(int j=1;j<=i;j++){
                System.out.print(i+"*"+j+"="+i*j+"\t");
                if(i==j)
                    System.out.print("\n");
            }
        }
    }
    
    /*
     * 程序17:
     * 題目:猴子吃桃問題。猴子第一天摘下若干個桃子 ,立即吃了一半,
     * 還不過癮,又多吃了一個,次日早晨又將剩下的桃子吃了一半,又多吃了
     * 一個。之後每一天早晨都吃了前一天剩下的一半零一個。到第10天早晨想再
     * 吃時,發現只剩下一個桃子了。求第一天共摘了多少?
     */
    public static void test17(){
        /*
         * 10:1
         * 9 :4
         * 8 :10
         * 7 :22
         */
        int s = 1;
        for(int i = 2;i<11;i++){
            s = (s+1)*2;
        }
        System.out.println("第一天共摘了"+s+"個桃子!");
    }
    
    /*
     * 程序18:
     * 題目:兩個乒乓球隊比賽,各出三人。甲隊爲a,b,c三人,乙對爲x,y,z三人。已抽籤決定比賽名單。
     * 有人向隊員打聽比賽的名單。a說 他不和x比,c不和x、z比。請編程,找出三隊賽手的名單。
     */
    /*
     * a-->z
     * b-->x
     * c-->y
     */
    public static void test18(){
        for(char i ='x';i<='z';i++){
            for(char j ='x';j<='z';j++){
                for(char k ='x';k<='z';k++){
                    if(i!=j&&i!=k&&j!=k&&i!='x'&&k!='x'&&k!='z'){
                        System.out.println("a vs "+i+"||b vs "+j+"||c vs "+k);
                    }
                }
            }
        }
    }
    
    /*
     * 程序19:
     * 題目:打印出以下圖形(菱形)
     *     *             
     *    *    *
     *   * * *
     *  * * * *
     *   * * *
     *    * *
     *     *
     */
    public static void test19(){
        //上半部分
        for(int i= 1;i<=4;i++){
            for(int j=4;j>i;j--){
                System.out.print(" ");
            }
            for(int k=2*i-1;k>=1;k--){
                System.out.print("*");
            }
            System.out.println();
        }
        //下半部分
        for(int i=3;i>=1;i--){
            for(int j=3;j>=i;j--){
                System.out.print(" ");
            }
            for(int k=2*i-1;k>=1;k--){
                System.out.print("*");
            }
            System.out.println();
        }
    }
    
    /*
     * 程序20:
     * 題目:有一分數序列:2/1 , 3/2 ,5/3,8/5;13/8;21/13
     * 求出這個數列前20項之和。
     */
    public static void test20(){
        double sum = 0;
        double n1 = 2,n2 =1;
        for(int i=1;i<=20;i++){
            sum +=(double)n1/n2;
            double t = n1;
            n1 = n1 + n2;
            n2 = t;
        }
        System.out.println(sum);
    }
    
    /*
     * 程序21:
     * 題目:求1+2!+3!+...+20!的和。
     */
    public static void test21(){
        

        long sum = 0;
        for(int i=1;i<=20;i++){
            long num = 1;
            for(int j=1;j<=i;j++){
                num *=j;
            }
            sum +=num;
        }
        System.out.println("總和爲:"+sum);
    }
    
    /*
     * 程序22:
     * 題目:利用遞歸的方法求5!。
     */
    public static int test22(int n){
        if(n==1){
            return 1;
        }
        return n*test22(n-1);
    }
    
    /*
     * 程序23:
     * 題目:有5我的坐在一塊兒,問第五我的多少歲?
     * 他說他比第四我的大2歲。問第四我的歲數,他說他比第三我的大2歲。
     * 問第三我的,又說比第二我的大2歲。問第二我的,他說他比第一我的大2歲。
     * 問第一我的,他說他是10歲。請問第五我的多大?
     */
    public static void test23(){
        int age = 10;
        for(int i = 1;i<=5;i++){
            age +=2;
        }
        System.out.println("第五我的歲數是 : "+age);
    }
    
    /*
     * 程序24:
     * 題目:給一個很少於5位的正整數,要求:
     * 1、求它是幾位數;
     * 2、逆序打印各位數字。
     */
    public static void test24(){
        int num = (int)(Math.random()*99999+1);
        System.out.println(num);
        int len = Integer.toString(num).length();
        LinkedList<Integer> link = new LinkedList<Integer>();
        for(int i = 1;i<=len;i++){
            int remainder = num%10;
            link.add(remainder);
            num = num/10;
        }
        System.out.println(link);
    }
    
    /*
     * 程序25:
     * 題目:一個五位數,判斷它是否是迴文數。即12321是迴文數,個位
     * 與萬位相同,十位與千位相同。
     */
    public static void test25(){
        int num = (int)(Math.random()*90000+10000);
        System.out.println(num);
        String strNumber = Integer.toString(num);
        if(strNumber.substring(0, 1).equals(strNumber.substring(4))&&strNumber.substring(1, 2).equals(strNumber.substring(3, 4))){
            System.out.println(strNumber+"是迴文數!");
        }else{
            System.out.println(strNumber+"不是迴文數!");
        }
    }
    
    /*
     * 程序26:
     * 題目:請輸入星期幾的第一個字母來判斷一下是星期幾,若是第一個字母同樣,
     * 則繼續判斷第二個字母。
     */
    /*
     * monday
     * tuesday
     * wednesday
     * thursday
     * friday
     * saturday
     * sunday
     */
    public static void test26() {
        Scanner sc = new Scanner(System.in);
        String str = sc.next().toLowerCase();
        System.out.println("str :" + str);
        char c = str.charAt(0);
        String param = "";
        char c2 = ' ';
        switch (c) {
        case 'm':
            param = "星期一";
            break;
        case 'w':
            param = "星期三";
            break;
        case 'f':
            param = "星期五";
            break;
        case 't':
            c2 = new Scanner(System.in).next().toLowerCase().charAt(0);
            if (c2 == 'u')
                param = "星期二";
            if (c2 == 'h')
                param = "星期四";
            System.out.println("你輸入 錯了!");
            break;
        case 's':
            c2 = new Scanner(System.in).next().toLowerCase().charAt(0);
            if (c2 == 'a')
                param = "星期六";
            if (c2 == 'u')
                param = "星期日";
            System.out.println("你輸入 錯了!");
            break;
        default:
            System.out.println("你輸入 錯了!");
        }
        System.out.println("你輸入的字母"+c+c2+"對應的是"+param);
    }
    
    /*
     * 程序27:
     * 題目:求100以內的素數。
     */
    public static void test27(){
        flag:for(int i=2;i<=100;i++){
            for(int j=2;j<=i-1;j++){
                if(i%j==0){
                    continue flag;
                }
            }
            System.out.println("100之內的素數有"+i);
        }
    }
    
    /*
     * 程序28:
     * 題目:對十個數進行排序。
     */
    public static void test28(){
        int[] arr =new int[10];
        for(int i=0;i<arr.length;i++){
            arr[i] = (int)(Math.random()*100+1);
        }
        System.out.println(Arrays.toString(arr));
        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int t = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = t;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    
    /*
     * 程序29:
     * 題目:求一個3*3矩陣對角線元素之和
     */
    public static void test29(){
        int[][] arr = new int[3][3];
        int sum = 0;
        for(int i=0;i<=2;i++){
            for(int j=0;j<=2;j++){
                arr[i][j] = (int)(Math.random()*100+1);
                System.out.print(arr[i][j]+"\t");
                if(i==j||i+j==2){
                    sum +=arr[i][j];
                }
            }
            System.out.println();
        }
        System.err.println("------------分割線----------------\n"+sum);
    }
    
    /*
     * 程序30:
     * 題目:有一個已經排好序的數組。現輸入一個數,要求按照原來的規律將
     * 它插入到數組中。
     */
    public static void test30(){
        //假設如今有一個長度爲10的數組,不妨設該數組是倒序排列
        int[] arr = new int[10];
        for(int i=0;i<=9;i++){
            arr[i] = (int)(Math.random()*30+1);
        }
        System.err.println(Arrays.toString(arr));
        //此次咱們用選擇排序
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]<arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
        //先隨機生產一個數
        int key = (int)(Math.random()*100+1);
        System.out.println("key:"+key);
        //假設咱們不知道這個數組是正序仍是到序
        int[] targetArr;
        if(arr[0]>=arr[9]){
            System.out.println("這個數組是倒序排列的!");
            targetArr = new int[arr.length+1];
            System.out.println("targetArr長度:"+targetArr.length);
            int i;
            for(i=0;i<arr.length;i++){
                if(arr[i]>key){
                    targetArr[i] = arr[i];
                }else{
                    targetArr[i] = key;
                    break;
                }
            }
            for(int j=i+1;j<targetArr.length;j++){
                targetArr[j] = arr[j-1];
            }
            System.out.println("targetArr:"+Arrays.toString(targetArr));
        }else{
            System.out.println("這個數組是正序排列的!");//和上面同理
            targetArr = new int[arr.length+1];
        }
    }
    
    /*
     * 程序31:
     * 題目:將一個數組逆序輸出。
     */
    public static void test31(){
        int[] arr1 = new int[10];
        int[] arr2 = new int[10];
        for(int i=0;i<arr1.length;i++){
            arr1[i] = (int)(Math.random()*100+1);
        }
        System.out.println("arr1"+Arrays.toString(arr1));
        for(int i=0;i<arr1.length;i++){
            arr2[i] = arr1[9-i];
        }
        System.out.println("arr2"+Arrays.toString(arr2));
    }
    
    /*
     * 程序32:
     * 題目:取一個整數a從右端開始的4~7位。
     */
    /*
     * 分析:
     * 這個整數a應該大於7位纔有意義,隨機生成一個7位數吧
     */
    public static void test32(){
        int num = (int)(Math.random()*9000000+1000000);
        System.out.println(num);
        String str = Integer.toString(num);
        char[] ch = str.toCharArray();
        int i = 0;
        System.out.println(ch);
        while(i<ch.length/2){
            char c = ch[i];
            ch[i] = ch[ch.length-1-i];
            ch[ch.length-1-i] = c;
            i++;
        }
        System.out.println(ch);
        String s="";
        for(int j=3;j<=6;j++){
            s += ch[j];
        }
        System.out.println("結果是"+s);
    }
    
    /*
     * 程序33:
     * 題目:打印出楊輝三角
     */
    public static void test33(){
        for(int i=1;i<=10;i++){
        }
    }
    
    /*
     * 程序34:
     * 題目:輸入三個數a,b,c,按大小順序輸出。(不妨有小到大吧)
     */
    public static void test34(){
        Scanner sc = new Scanner(System.in);
        System.out.println("請按順序輸入a,b,c:");
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        System.out.println("a="+a+", b="+b+", c="+c);
        if(a>=b){
            if(c>=a){
                System.out.println(b+" "+a+" "+c);
            }else{
                if(c<=b){
                    System.out.println(c+ " "+b+" "+a);
                }else{
                    System.out.println(b+" "+c+" "+a);
                }
            }
        }else{  //a<b
            if(c>=b){
                System.out.println(a+" "+b+" "+c);
            }else
                if(c<=a) System.out.println(c+" "+a+" "+b);
                else System.out.println(a+" "+c+"  "+b);
        }
    }
    
    /*
     * 程序35:
     * 題目:輸入數組,最大與第一個元素交換,最小與最後一個元素交換,輸出數組。
     */
    public static void test35(){
        //隨機生成一個長度爲8的數組
        int[] arr = new int[8];
        for(int i=0;i<arr.length;i++){
            arr[i] = (int)(Math.random()*30+1);
        }
        System.out.println(Arrays.toString(arr));
        int max = arr[0],min = arr[0];
        int a=0,b=0;
        for(int i=1;i<arr.length;i++){
            if(max<arr[i]){
                max = arr[i];
                a = i;
            }
            
            if(min>arr[i]){
                min = arr[i];
                b = i;
            }
        }
        System.out.println("max="+max+",a = "+a);
        System.out.println("min="+min+",b = "+b);
        
        if(arr[0]!=arr[a]){
            int temp = arr[0];
            arr[0] = arr[a];
            arr[a] = temp;
        }
        if(arr[arr.length-1]!=arr[b]){
            int temp =arr[arr.length-1];
            arr[arr.length-1] = arr[b];
            arr[b] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }
    
    /*
     * 程序36:
     * 題目:有n個整數,使其前面各數順序向後移動m個位置,最後m個數變成最前面的m個數。
     */
    public static void test36(int len,int m){
        int st = m;
        int[] arr1 = new int[len];
        int[] arr2 = new int[len];
        int j=0;
        for(int i=0;i<arr1.length;i++){
            arr1[i] = (int)(Math.random()*100+1);
            if(m<len){
                arr2[m] = arr1[i];
                m++;
            }
            if(i>=arr2.length-st){
                arr2[j] = arr1[i];
                j++;
            }
        }
        System.out.println("arr1"+Arrays.toString(arr1));
        System.out.println("arr2"+Arrays.toString(arr2));
    }
    
    /*
     * 程序37:
     * 「約瑟夫環」問題
     * 題目:有n我的圍成一個圈,順序排號。從第一我的開始報數(從1到3報數),凡是報3
     * 的人退出圈子,問最後留下來的人是原來的第幾號?
     */
    public static void test37(int n){
        List<Integer> list = new LinkedList<Integer>();
        for(int i=0;i<n;i++){
            list.add(i+1);
        }
        System.out.println(list);
        int index = -1;
        while(list.size()>1){
            index = (index+3)%list.size();
            list.remove(index--);
        }
        System.out.println(list.get(0));
    }
    
    /*
     * 程序38:
     * 題目:寫一個函數,求一個字符串的長度.
     */
    public static void test38(String str){
        if(str==null){
            try {
                throw new Exception("你輸入的數字字符串爲空!");
            } catch (Exception e) {
                System.err.println(e.getMessage());
                return;
            }
        }
        char[] ch = str.toCharArray();
        System.out.println(Arrays.toString(ch));
        System.out.println(ch.length);
    }
    
    /*
     * 程序39:
     * 題目:編寫一個函數,輸入n爲偶數時,調用函數求
     * 1/2+1/4+...+1/n;當輸入n爲奇數時,調用函數
     * 1/1+1/3+...+1/n
     */
    public static void test39(){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        double d = 0;
        if(n%2==0){
            for(int i=1;i<=n/2;i++){
                d +=(double)1/(2*i);
            }
        }else{
            for(int i=1;i<=n;i++){
                if(i%2!=0){
                    d +=(double)1/i;
                }
            }
        }
        System.out.println(d);
    }
    
    /*
     * 程序40:
     * 題目:給一組字符串排序。
     */
    public static void test40(){
        Set<String> set = new TreeSet<String>();
        set.add("abc");
        set.add("abb");
        set.add("bbb");
        set.add("ccc");
        System.out.println(set);
    }
    
    /*
     * 程序41:
     * 題目:海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子平均分爲5份,多了一個,
     * 這隻猴子把多的一個扔進海中,拿走了一份。第二隻猴子把剩下的桃子又平均分紅5份,又多了
     * 一個,它一樣把多的一個扔進海中,拿走了一份。第3、第4、第五隻猴子都是這樣作的,問海灘上
     * 原來有多少隻桃子?
     */
    public static void test41(){
        int i=1;
        while(i<10000){
            int temp = i;
            int count = 1;
            for(int j=1;j<=5;j++){
                if((temp%5)==1){
                    temp = (int) ((temp-1)*0.8);
                    count++;
                    if(count==6){
                        System.out.println(i);
                        break;
                    }
                }
            }
            i++;
        }
    }
    
    /*
     * 程序42:
     * 題目:809*?? = 800*??+9*??
     * 其中??表明的兩位數,8*??的結果爲兩位數,9*??的結果爲3位數。
     * 求??表明的兩位數,及809*??的結果。
     */
    public static void test42(){
        for(int i =10;i<=99;i++){
            if(809*i==(800*i+9*i) && (8*i>=10 && 8*i<100)&& (9*i>=100 && 9*i<1000)){
                System.out.println(i);
            }
        }
    }
    
    /*
     * 程序43:
     * 題目:求0-7所能組成的奇數的個數。
     * 改成:求0-7所能組成的奇數的個數。(各個位數上的數字不能重複)
     */
    public static void test43(){
        //4  4*6  4*6*6  4*6*6*5  4*6*6*5*4 4*6*6*5*4*3
        //4*6*6*5*4*3*2  
        long lon = 0L;
        for(int i=8;i>0;i--){
            if(i==8)
                lon = 4;
            if(i==7)
                lon = lon+4*6;
            lon +=lon*i;
        }
        System.out.println(lon);
    }
    
    /*
     * 程序44:
     * 題目:一個偶數總能表示爲兩個素數之和。
     * 轉換爲:隨機生成一個大於等於8的偶數,而後求
     * 它的質數,而且它的質數和等於這個數字。
     */
    public static void test44(){
        int targetNumber = 0;
        while(true){
            targetNumber = (int)(Math.random()*100+1);
            if(targetNumber>=8 && targetNumber%2==0) break;
        }
        System.out.println(targetNumber);
        flag:
        for(int i=2;i<targetNumber;i++){
            if(i%2==1 && ((targetNumber-i)%2==1)){
                for(int j=2;j<i;j++){
                    if(i%j==0){
                        continue flag;
                    }
                }
                for(int j=2;j<targetNumber-i;j++){
                    if((targetNumber-i)%j==0){
                        continue flag;
                    }
                }
                System.out.println(i+"   "+(targetNumber-i));
            }
        }
    }
    
    /*
     * 程序45:
     * 題目:判斷一個整數能被幾個9整除。
     */
    public static void test45(int num){
        int count=0;
        while(num%9==0){
            count++;
            num /=9;
        }
        System.out.println(num+" 能被 "+count+"個9整除!");
    }
    
    /*
     * 程序46:
     * 題目:兩個字符串鏈接。
     */
    public static void test46(){
        Scanner  sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        StringBuilder sb = new StringBuilder();
        sb.append(str1).append(str2);
        String str = sb.toString();
        System.out.println(str);
    }
    
    /*
     * 程序47:
     * 題目:讀取7個數(1-50)的整數值,每讀取一個值,程序打印出該值的個數* 。
     */
    public static void test47(){
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<7;i++){
            int temp = sc.nextInt();
            if(!(temp>=1&&temp<=50)){
                System.out.println("請輸入1-50的數字");
                return;
            }
            for(int j=1;j<=temp;j++){
                System.out.print("*");
            }
            System.out.println();
        }
    }
    
    /*
     * 程序48:
     * 題目:某個公司採用公用電話傳遞數據,數據是4位的整數,在傳遞過程當中是加密的,加密規則以下,
     * 每位數字都加上5,而後用和除以10的餘數代替該數字,再將第一位和第四位交換,第二位和第三位交換。
     */
    public static void test48(int num){
        System.out.println("未加密前的數據是 num :"+num);
        String regex = "[1-9][0-9]{3}";
        String temp = Integer.toString(num);
        if(!(temp.matches(regex))){
            try {
                throw new Exception("該數字不是4位整數");
            } catch (Exception e) {
                System.err.println(e.getMessage());
                return;
            }
        }
        
        int g = num%10;
        int s = num/10%10;
        int b = num/100%10;
        int q = num/1000;
        int[] arr = {q,b,s,g};
        for(int i=0;i<arr.length;i++){
            arr[i] +=5;
            arr[i] %=10;
        }
//        System.out.println(Arrays.toString(arr));
        for(int i=0;i<arr.length/2;i++){
            int t = arr[i];
            arr[i] = arr[arr.length-1-i];
            arr[arr.length-1-i] = t;
        }
        System.out.print("加密後的數據是 num :");
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]);
        }
    }
    /*
     * 程序49:
     * 題目:計算字符串中子字符串出現的次數。
     */
    public static void test49(String fatherStr,String sonStr){
        String[] strArr = fatherStr.split(sonStr);
        System.out.println(strArr.length-1);
    }
    /*
     * 程序50:
     * 題目:有5個學生,每一個學生有三門課的成績,從鍵盤輸入以上數據(包括學生號、姓名、
     * 三門課成績),計算出平均成績,把原有的數據和計算出的平均分數存放在磁盤文件「stud」中,
     */
    public static void test50() throws IOException{
        List<String> list = new LinkedList<String>();
        Scanner sc = new Scanner(System.in);
        String temp = null;
        for(int k=0;k<=4;k++){
            System.out.println("請輸入有學號、姓名、語文成績、數學成績、外語成績:");
            temp = sc.nextLine();
            String[] strArr = temp.split("\\、");
            double dou = 0.0,avg=0.0;
            for(int i=2;i<strArr.length;i++){
                dou += Double.parseDouble(strArr[i]);
            }
            avg = dou/3;
            list.add(temp+"、"+avg);
            System.out.println(temp+"、"+avg);
        }
        System.out.println(list);
        File file = new File("C:\\Users\\xinxin\\Desktop\\stud.txt");
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
        for(String s:list){
            bw.write(s+"\r\n");
        }
        bw.flush();
        bw.close();
    }
}

java

相關文章
相關標籤/搜索