[Java練習](9)Armstrong number

題目:找出1000以內所有三位數的Armstrong number

Armstrong number:153=1^3+5^3+3^3

public class Armstrong {
public static void main(String args[]) {
for (int i = 100 ; i<1000 ;i++) {
if ((i/100)(i/100)(i/100)+((i/10)%10)((i/10)%10)((i/10)%10)+(i%10)(i%10)(i%10)==i){
System.out.println(i);
}
}
}
}

Output:

153
370
371
407

[Java範例](1)Array排序法三種

//實作Bubble sort大到小
 public class TestNumberSortEx1 {
 int[] data = {52,10,7,286,9};
public void sort1() {
    for (int i=0;i<data.length;i++) {
        for(int j=i+1;j<data.length;j++) {
            int temp=0;
            if (data[i]<data[j]) {
                temp = data[i];
                data[i]=data[j];
                data[j]=temp;
            }//三角交換法
        }
    }
}


//實作雙向排序法大到小
public void sort2() {
    while(true) {//無窮迴圈
        int count=0;//記數給無窮迴圈斷點
        //index比長度小1

        for (int i = 0;i<data.length-1;i++) {
            int temp =0;
            if(data[i]<data[i+1]) {
                temp=data[i];
                data[i] = data[i+1];
                data[i+1] = temp;
                count++;
            }
        }
            if (count==0) {
                break;
            }
        }
    }

public void sort3() {
    Arrays.sort(data); //sort預設小到大
}

[Java練習](8)數字排序

題目:隨機創造100000個不同的數字範圍在1-42的數字,依照出現次數排序,從多的次數排到最少的

public class TestArraySortSirSolution {
     int[] count = new int[42];//記數
     int[] number = new int[42];//用來存1-42號碼
public void createLotteryNumber() {

    for (int i = 1;i<=100000;i++) {
        int rNum =(int)((Math.random()*42)+1);
    //先產生一個random 1-42內整數 重複做100000次
    //將1出現的次數存入新陣列count[0]中以此類推 
        count[rNum-1]++;
    }
    for (int j= 1;j<=42;j++) {
        number[j-1]=j;//number[0]=1...
    }
}
//使用此排序方法讓count跟number序號同時移動
public void sort1() {
    for (int i = 0; i < count.length - 1; i++) {
        for (int j = i + 1; j < count.length; j++) {
            int temp1 = 0, temp2 = 0;

            if (count[i] < count[j]) {
                temp1 = count[i];
                count[i] = count[j];
                count[j] = temp1;

                temp2 = number[i];
                number[i] = number[j];
                number[j] = temp2;
            }

        }
    }
}
public void printResult() {
    for(int k =0;k<count.length;k++) { 
        System.out.printf("%2d %d\t",number[k],count[k]);
        if ((k+1)%7==0) {
            System.out.println(" ");//換行
        }

    }
}

public static void main(String[] args) {
    TestArraySortSirSolution stats = new TestArraySortSirSolution();
    stats.createLotteryNumber();
    System.out.println("Original Data:");
    System.out.println("--------------------------------------------------------------------------");
    stats.printResult();
    System.out.println("--------------------------------------------------------------------------");
    System.out.println("Sorted Data:");
    System.out.println("--------------------------------------------------------------------------");
    stats.sort1();
    stats.printResult();
    System.out.println("--------------------------------------------------------------------------");
}

Output (每次數字不一樣)

[Java練習](4)一元二次方程式根

題目:設定一元二次方程式,ax^2+bx+c=0,找出此方程式的實根。

演算法:判別式b^2-4ac>0 有兩個根為-b+b^2-4ac/2a -b-b^2-4ac/2a

b^2-4ac= 0 有一實根為重根

判別式<0 無實根解

public static void main(String[] args) {
    //整數abc 問ax^2+bx+c=0 x的解
    //給出三個整數
    int a=1;
    int b=2;
    int c=1;
    //給判別式 一個變數
    int d = ((b*b)-(4*a*c));
    //若有兩實根解的情況會是兩個double
    double x1 ,x2;
    //a要不等於0才是二元一次方程式
    if (a!=0) {
        //確認a不等於0 判別式>0者有兩實根 兩個根為-b+-根號d/2a
        if (d>0) {
            x1 = ((-b+(double)Math.sqrt(d))/(2*a));
            x2 = ((-b-(double)Math.sqrt(d))/(2*a));
            System.out.println("x="+x1 +"or x="+ x2);
            }
        //判別式等於零為重根 根為-b/2a
        else if(d==0) {
            x1=(-b/(2*a));
            System.out.println("此情況為重根x="+x1);  
        //若判別式<0 則無實根解
        }else {
            System.out.println("此情況無實根解");
        }
    }else {
        System.out.println("此非二元一次方程式");
    }
}

Output:此情況為重根x=-1.0

[Java練習](3)剪刀石頭布遊戲

題目:設計隨機猜到有人勝出為止的兩人剪刀石頭布遊戲

String[] S ={"scissors","stone","paper"};
    while(true) {
      //AB兩人出的拳用隨機決定
        int a = (int)(Math.random()*3);
        int b = (int)(Math.random()*3);

        if(a==b) {
            System.out.printf("這兩人平手,AB都出%s\n",S[a]);
        }//剪刀石頭布演算法
        else if(a==(b+1)||(a==0&&b==2)){
            System.out.printf("A獲勝,A出%s,B出%s\n", S[a],S[b]);
            break;//有人獲勝break結束
        }else {
            System.out.printf("B獲勝,A出%s,B出%s\n", S[a],S[b]);
            break;//有人獲勝break結束
        }

    }

Output:

這兩人平手,AB都出stone
B獲勝,A出paper,B出scissors

[Java練習](2)閏年判斷練習

題目內容:給兩整數一為年份,一為月份,判斷該年是否為閏年及該月有幾天

閏年判斷規則:可以被 4 整除的年份為閏年:例如,1988、1992 及 1996 均為閏年。 然而,仍有一個小誤差必須列入考量。為了消除這個誤差,西曆規定,可以被 100 整除的年份 (例如 1900) 必須同時被 400 整除才是閏年。

基於這個原因,下列年份為非閏年: 1700、1800、1900、2100、2200、2300、2500、2600 這是因為這些年份可被 100 整除,但不能被 400 整除。

下列年份「均為」閏年:
1600, 2000, 2400
這是因為它們可以同時被 100 和 400 整除。

    int month = 2;
    int leapyear = 2019 ;

    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
        System.out.println(month + " has 31 days.");
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        System.out.println(month + " has 30 days.");
    } else if (month == 2) {
        //...leap year.
        if(leapyear%4==0){
            //先判斷此年份能不能被4整除
            if (leapyear%100==0 && leapyear%400!=0){
                //被100整除的年份要能被400同時整除才可以是閏年
                System.out.println(leapyear + "此年份不為閏年,2月有28天"); }
            else{
                System.out.println(leapyear + "此年份為閏年,2月有29天"); }
        }else { //不能被4整除的數都不是閏年 
            System.out.println("此年不為閏年,2月有28天");
        }
    } else {
        System.out.println("Invalid Month");}
        System.out.println("finished");}

Output:

此年不為閏年,2月有28天
finished

[Java練習](1)攝氏華氏溫度轉換

題目:任給一整數degree 和 index
index 為1時攝氏轉華氏
index 為2時華氏轉攝氏
並列印出來
攝氏(C)華氏(F)轉換演算法:F = ( C*9/5)+32

public static void main(String[] args) {
    int degree = 100;
    int index = 1; 
    float Newdegree;
    Newdegree =(float) degree;//將度數強制轉型成float 
    if(index==1) { //當index = 1的情況 把攝氏度數轉華氏
        System.out.println("華氏度數為"+((Newdegree*9/5)+32)+"度");
    } 
    else if(index==2) {//當index = 2的情況 把華氏度數轉攝氏
        System.out.println("攝氏度數為"+((Newdegree-32)*5/9)+"度");
    }
}

Output:華氏度數為212.0度