[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練習](7)發牌遊戲

題目:模擬撲克牌發牌,每位玩家發兩張牌。

public class TestPoker {
//存取出現過幾次的陣列
int[][] poker =new int[4][13];
//四種花色的陣列
String[] pokersign = {“Spade","Heart","Diamond","Club"};
//發牌方法
public void Go() {
//重複發牌(for迴圈)
for(int i =1;i<=4;i++) { //i為玩家人數
if(i<=26) { //至多只能26位玩家
int sign = (int)(Math.random()4); //花色隨機
int sign2 = (int)(Math.random()4);//花色隨機
int number = (int)(Math.random()13); //數字隨機
int number2 = (int)(Math.random()13); //數字隨機
if(sign!=sign2||number!=number2) { //同時發出的兩張牌不能相等
if((poker[sign][number]==0)&&(poker[sign2][number2]==0)) {
//二維陣列上記數0的兩張牌才能發出
System.out.printf(“發給玩家%d的撲克牌花色為%s%2d 和%s%2d\n",i,pokersign[sign],number+1,pokersign[sign2],number2+1);
poker[sign][number]++; //發過的在二維陣列上記數
poker[sign2][number2]++; //發過的在二維陣列上記數
}else {
i–; //出現二維陣列上記數過的牌時迴圈倒回去重做
}
}else {
i–; //出現兩張一樣的牌時迴圈倒回去重做
}
}else { //超過26位的玩家
System.out.printf(“第%2d位玩家沒牌了不准玩!\n",i);
}
}
}

public static void main(String[] args) {
    TestPoker test1 = new TestPoker();
    test1.Go();
}

Output:

發給玩家1的撲克牌花色為Club11和Diamond10
發給玩家2的撲克牌花色為Club 5和Club13
發給玩家3的撲克牌花色為Club 1和Club 6
發給玩家4的撲克牌花色為Spade10和Heart10

[Java練習](5)費氏數列

題目:列印費氏數列48個

        int p1 = 1; //數列第一項
        int p2 = 1; //數列第二項
        int res = 0;
        String total="";
        System.out.print(p1+" ");
        System.out.print(p2);
        for(int i = 3; i <= 48; i++) {
            res = p1 + p2; //res為第三項=第一+第二
            p1 = p2;//將第2項的值存給第一項
            p2 = res;//將第三項的值存給第二項
            total =total+" "+res; //產生加總字串
    }
 System.out.print(total);

Output:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 …共48項

[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