2020年3月8日 星期日

[zerojudge]a147. Print it all

a147. Print it all

核心:i % 7 == 0? "": i + " "
如果i被7整除就輸出空字串,不整除就輸出i加空白。Yeah

BTW科皓不要

程式碼如下:

/* Pa147.java
* a147. Print it all 
*
* 我的意思是說 科皓不要啦
* 2020/3/8
*/

import java.util.Scanner;

public class Pa147{

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            int n = scanner.nextInt();

            for(int i = 1; i < n; i++){
                System.out.print(i % 7 == 0? "": i + " ");
            }

            System.out.println();
        }

    } 
}

[zerojudge]a121. 質數又來囉

a121. 質數又來囉

決定使用比較懶的方法,BigInteger再度出場,大材小用,牛刀割雞,把你用在這邊真是抱歉哈~

        if(big(元a)是質數) // 因為不管怎樣下面的迴圈都會執行一次,導致sum+1,所以如果a是質數的話要先-1,免得加兩次
            sum = -1
        else
            sum = 0
        
        while(big <= b){
            big = 下一個可能質數
            sum++
        }
    
很棒吧,只是單單輸出sum還不夠,因為不知道哪一筆資料會讓sum = -1,想破頭也想不出來什麼樣的情況會讓sum = -1,索性在sum == -1時輸出0
可能是真的有BUG吧,阿彌陀佛。

程式碼如下:

/* Pa121.java
 * a121. 質數又來囉 
 *
 * 科皓不要
 * 2020/3/8
 */

import java.util.Scanner;
import java.math.BigInteger;

public class Pa121{

 public static void main(String[] args){
  Scanner scanner = new Scanner(System.in);

  while(scanner.hasNext()){
   BigInteger big = new BigInteger(scanner.next());
   BigInteger b = new BigInteger(scanner.next());
   
   int sum = big.isProbablePrime(1000)? 0: -1;

   while(big.compareTo(b) != 1){
    big = big.nextProbablePrime();
    sum++;
   }

   System.out.println(sum == -1? 0: sum);
  }

 } 
}

[zerojudge]a104. 排序

a104. 排序

Arrays提供了sort(排序)方法,如果想要了解實作可以參考:演算法筆記Sort
Arrays還有toString,可以印出陣列,比方說{0, 1, 2, 3}的陣列會印成[0, 1, 2, 3],可是不需要逗號和中括號,所以用String本身就有的replaceAll方法, 用正規表示式(regular expression)去把[或]或,挑出來取代成空字串(殺掉)。
那個括號居然要兩個反斜線來表示,真是攪死我了。參考:Backslashes, escapes, and quoting

程式碼如下:

/* Pa104.java
* a104. 排序 
*
* 科皓不要
* 2020/3/8
*/

import java.util.Scanner;
import java.util.Arrays;

public class Pa104{

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            int[] nums = new int[scanner.nextInt()];
            
            for(int i = 0; i < nums.length; i++){
                nums[i] = scanner.nextInt();
            } 

            Arrays.sort(nums);

            System.out.println(Arrays.toString(nums).replaceAll("[\\[\\],]", ""));
        }

    } 
}   

2020年3月7日 星期六

[zerojudge]a095. 麥哲倫的陰謀

a095. 麥哲倫的陰謀


因為黃色比較漂亮,絕對不是因為我畫錯了

  • 1個紅帽:
    1. 紅帽看到其他人都是黃帽→我就是紅帽,出去
    2. 黃帽發現紅帽走了→我不是紅帽,出去
  • 2個紅帽:
    1. 紅帽看到有一個紅帽,不能確定自己是不是紅帽
    2. 紅帽發現那個紅帽沒有走→那個紅帽看到有其他紅帽→那個紅帽就是我,出去
    3. 黃帽發現兩個紅帽都走了→我是黃帽,出去
  • 3個紅帽:
    1. 紅帽看到有兩個紅帽,不能確定自己是不是紅帽
    2. 紅帽發現那兩個紅帽都沒有走,不能確定自己是不是紅帽
    3. 紅帽發現那兩個紅帽都沒有走→我是紅帽,出去
    4. 黃帽發現三個紅帽都走了→我是黃帽,出去
  • 4個紅帽:
    1. 紅帽看到有三個紅帽,不能確定自己是不是紅帽
    2. 紅帽發現那三個紅帽都沒有走,不能確定自己是不是紅帽
    3. 紅帽發現那三個紅帽都沒有走,不能確定自己是不是紅帽
    4. 紅帽發現那三個紅帽都沒有走→我就是紅帽,出去
出去的前提是「完全確定自己是什麼顏色」,反過來說不出去是因為「不能確定自己是什麼顏色」。

完全不知道自己在講什麼,反正就是if(n == m) m天,else就m + 1天。

程式碼如下:

/* Pa095.java
* a095. 麥哲倫的陰謀 
*
* 科皓不要
* 2020/3/8
*/

import java.util.Scanner;

public class Pa095{

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            int n = scanner.nextInt();
            int m = scanner.nextInt(); 
            
            System.out.println(n == m? m: m + 1);
        }

    }
    
}      

[zerojudge]a065. 提款卡密碼

a065. 提款卡密碼

迴圈次數
很顯然你只要跑n-1次迴圈兩兩比對就可以了。
字元可以做運算,酷吧!

程式碼如下:

/* Pa065.java
* a065. 提款卡密碼 
*
* 科皓不要
* 2020/3/7
*/

import java.util.Scanner;

public class Pa065{

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            char[] chs = scanner.next().toCharArray();
            
            for(int i = 0; i < chs.length - 1; i++){
                System.out.print(Math.abs(chs[i] - chs[i+1]));
            } 

            System.out.println();
        }
    }
}    

[zerojudge]a059. 完全平方和

a059. 完全平方和

在a~b之間尋找平方數然後加總,所以要找平方後>=a平方後<=b的兩個數當作起點和終點
開根號a之後可能是整數或小數,如果是小數就要「無條件進位」(ceiling),b則「無條件捨去」(floor)。
ceiling = 天花板
floor = 地板

程式碼如下:

/* Pa059.java
* a059. 完全平方和 
*
* 科皓不要
* 2020/3/7
*/

import java.util.Scanner;

public class Pa059{

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){

            int T = scanner.nextInt();

            for(int i = 1; i <= T; i++){
                int sum = 0;
                int a = (int)Math.ceil(Math.sqrt(scanner.nextInt()));
                int b = (int)Math.floor(Math.sqrt(scanner.nextInt()));

                for(; a <= b; a++){
                    sum += a * a;
                }

                System.out.println("Case " + i + ": " + sum);
            }
        }
    }
}      

[zerojudge]a058. MOD3

a058. MOD3

一臉就是要用陣列解的樣子,不用對不起它。因為%3, %3 + 1, %3 + 2是連續的嘛~

程式碼如下:

/* a058. MOD3
* Pa058.java
*
* 科皓不要
* 2020/3/7
*/

import java.util.Scanner;

public class Pa058{

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            int[] k = {0, 0, 0};
            int n = scanner.nextInt();

            for(int i = 0; i < n; i++){
                k[scanner.nextInt() % 3]++;
            }

            System.out.printf("%d %d %d%n", k[0], k[1], k[2]);
        }
    }
}