PAT (Basic Level) Practise (中文)練習(Java語言組)
1001. 害死人不償命的(3n+1)猜想 (15/15)
卡拉茲(Callatz)猜想:
對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公佈了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很傻很天真的命題,結果鬧得學生們無心學業,一心只證(3n+1),以至於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……
我們今天的題目不是證明卡拉茲猜想,而是對給定的任一不超過1000的正整數n,簡單地數一下,需要多少步(砍幾下)才能得到n=1?
輸入格式:每個
輸出格式:輸出從n計算到1需要的步數。
輸入樣例:3輸出樣例:
5
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int i=0; while(n!=1){ if(n%2==0){ n=n/2; }else{ n=(3*n+1)/2; } i++; } System.out.println(i); } } }
注意:迴圈條件
1002. 寫出這個數 (20/20)
讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。
輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。
輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1空格,但一行中最後一個拼音數字後沒有空格。
輸入樣例:1234567890987654321123456789輸出樣例:
yi san wu
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String string=sc.nextLine(); int s=0; for(int i=0;i
注:這個程式剛開始有點問題,部分正確,想了一下,是因為不知道和的位數,不能只算三位的,將算出來的結果又轉換成字串,在取每一位。
1003. 我要通過(20)
“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於PAT的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
1. 字串中必須僅有P, A, T這三種字元,不可以包含其它字元;
2. 任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;
3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是空字串,或者是僅由字母 A 組成的字串。
輸入格式:每個測試輸入包含1個測試用例。第1行給出一個自然數n (<10),是需要檢測的字串個數。接下來每個字串佔一行,字串長度不超過100,且不包含空格。
輸出格式:每個字串的檢測結果佔一行,如果該字串可以獲得“答案正確”,則輸出YES,否則輸出NO。
輸入樣例:8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA輸出樣例:
YES YES YES YES NO NO NO NO
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
for(int i=0; i=1 && nump==1 && numt==1){
if(str.indexOf('P')*(str.indexOf('T')-str.indexOf('P')-1)
== str.length() - str.indexOf('T')-1) //?????????
flag = true;
else
flag = false;
}
if(flag)
System.out.println("YES");
else
System.out.println("NO");
}
}
}
這個題之前做的時候一直在想如何一次性的將n個字串輸入進去,可後來發現原來不用一次性全把n個串輸進去,一次一個,邊輸入邊判斷也是可以的。浪費了我的感情。。。
1004. 成績排名 (20)
讀入n名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。
輸入格式:每個測試輸入包含1個測試用例,格式為
第1行:正整數n 第2行:第1個學生的姓名 學號 成績 第3行:第2個學生的姓名 學號 成績 ... ... ... 第n+1行:第n個學生的姓名 學號 成績其中姓名和學號均為不超過10個字元的字串,成績為0到100之間的一個整數,這裡保證在一組測試用例中沒有兩個學生的成績是相同的。
輸出格式:對每個測試用例輸出2行,第1行是成績最高學生的姓名和學號,第2行是成績最低學生的姓名和學號,字串間有1空格。
輸入樣例:3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95輸出樣例:
Mike CS991301 Joe Math990112
程式碼如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
sc.nextLine();
int max=-1,min=101;
String maxs="",mins="";
for(int i=0;i<n;i++){
String s=sc.nextLine();
String subs=s.substring(s.indexOf(" ")+1);
int index=subs.indexOf(" ");
int gra=Integer.parseInt(subs.substring(index+1));
String nam=s.substring(0,index+s.indexOf(" ")+1);
if(gra>max){
max=gra;
maxs=nam;
}
if(gra<min){
min=gra;
mins=nam;
}
}
System.out.println(maxs);
System.out.println(mins);
}
}
}
令Pi表示第i個素數。現任給兩個正整數M <= N <= 104,請輸出PM到PN的所有素數。
輸入格式:
輸入在一行中給出M和N,其間以空格分隔。
輸出格式:
輸出從PM到PN的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。
輸入樣例:
5 27
輸出樣例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int m=sc.nextInt();
int n=sc.nextInt();
int[] su=new int[4000];
su[0]=2;
int index=1;
for(int i=3;i<10000;i+=2){
if(Su(i))
su[index++]=i;
}
int num=n-m+1;
int hang=num/10;
int yu=num%10;
m=m-1;
for(int i=0;i
這個題第一次做是在比賽的時候做的,寫了好多次,都是執行超時,讓人很鬱悶。現在在寫寫。