2016年10月16日 星期日

ITSA50 Problem 4. 偽造的金幣!!

Problem 4. 偽造的金幣!! 
(Time Limit: 2 seconds) 

問題描述 :

在 n 袋金幣中,有一袋金幣是偽造的,但我們不知道哪一袋金幣是偽造的
金幣,我們知道偽造的金幣比真的金幣還輕,而手邊又正好只有沒有刻度的天秤,
天秤的一端可放多袋金幣,聰明的你最多需要使用天秤幾次,保證一定能找出哪
一袋是偽造的金幣。

輸入說明:

第一行為一個整數 N ( 0 < N ≤ 20 ) 代表有 N 組測試資料,之後會有 N 行
數字,每一行數字代表 n ( 2 ≤ n ≤ 1000000 ) 袋金幣。

輸出說明:
輸出 N 組測試資料可使用天秤的最多次數,最後必須有換行字元。
範例:
Sample Input:               Sample Output:
3                                    2
8                                    3
17                                  5
100


重點說明:這題在我吃著火腿炒飯想出來的
因為他說要一定要找出來那袋假的,且一定要是次數最少的
簡單來說就是當你分成兩份的時候,也會有留剩下來的或是沒有
例如8袋,最一開始可以分成四袋四袋,然後一定會有一邊有假的
接下來就重複動作,兩袋兩袋,最後剩兩袋,這時候就可以一定知道哪邊是假的,這樣總共分了三次
可是如果一開始分成三袋三袋,這樣留下來的會有兩袋,在磅秤上的那兩邊
一定會有一邊是有假的,因為如果是平的為真,這樣你只要比剩下的兩袋,可是這樣有個問題,就是他一定要找出來,所以這樣會有問題,所以在磅秤上比的結果必定要為False,除非到了只剩3袋以下
簡單來說就是2X+Y=總袋數  X>=Y到最接近

程式碼:
import java.util.Scanner;

public class ITSA50_4 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
while(n-->0){
int t=sc.nextInt();
int time=0;
int a=t/2;
int i;
while(a!=1){
for(i=a;;i--){
if(!(i>=t-i*2)){
break;
}
}
a=i+1;
t=a;
time++;
//System.out.println(a);
}
System.out.println(time);
}

}

}

ITSA50 Problem3 我要九十九

Problem 3. 我要九十九 
(Time Limit: 2 seconds) 

問題描述 :

只要當過學生,一定很多人在算分數的時候,聽過老師跟大家說開根號乘以
十 。 通常大家這樣都會很開心,因為只要 36 分就可以及格了 ! 但是, 36 分
以下的同學就很頭痛了 。 在壓力太大的情況下,有些學生就作夢,夢到老師跟
他們說,要讓他們開更號乘以十很多次,可是最後出來的分數要到 99 分才讓他
們過 。 數學好的你,可以告訴他們到底最少需要做多少次開根號乘以十,才能
夠讓分數等於 99 嗎 ? 當輸入為 -1 時結束程式 。 ( 開根號之後都四捨五入
到小數第一位 )

輸入說明:

輸入若干筆正整數 N , 0 < N < 36,直到輸入-1 時停止。

輸出說明:
一個正整數 ( 共做了幾次開根號乘以十 ),最後必須有換行字元。

範例:
Sample Input:                       Sample Output:
20                                         8
35                                         7
-1


重點說明:Math.sqrt(num)開根號,Math.round(num)四捨五入
JAVA真是好,好爽不用自己寫ㄏㄏ

程式碼:
import java.util.Scanner;
public class ITSA50_3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double num;
while((num=sc.nextDouble())!=-1){
int time=0;
while(num!=99){
num=Math.sqrt(num);
   num*=10;
   num=Math.round(num);
   time++;
}
System.out.println(time);
}
}
}

題目複製的問題

從PDF上複製下來好麻煩
我原本直接想從E-tutor摳過來
不過怕沒帳號的人,燈不進去看不到題目
之後因該用複製貼上+網址吧大概

ITSA50 Problem2 The Typhoon

Problem 2. The Typhoon 
(Time Limit: 2 seconds) 

問題描述 : 
已知行列式運算為 
a b c
d e f
g h i 
= a * e * i + d * h * c + g * b * f - c * e * g - b * d * i - a * f * h 

求以下三階行列式的結果。 

輸入說明: 
第一行輸入一正整數 N,表示共有N 筆測試資料(1 ≤ N ≤ 100),每筆測試資
料為一個行列式,行列式內容為 3 列,每一列有 3 個整數,用空白分開。 
例如輸入內容為: 
1 2 3 
4 5 6 
7 8 9 
輸出說明: 
輸出計算的答案,最後必須有換行字元。 
例如輸出為:0 

範例: 
Sample Input:       Sample Output: 
2                            0
1 2 3                      -258
4 5 6 
7 8 9 
6 9 4 
2 4 9 
1 8 3 

重點說明:阿上面都跟我說了,直接寫了


程式碼:
import java.util.Scanner;
public class ITSA50_2 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int a,b,c,d,e,f,g,h,i;
while(n-->0){
a=sc.nextInt();
b=sc.nextInt();
c=sc.nextInt();
d=sc.nextInt();
e=sc.nextInt();
f=sc.nextInt();
g=sc.nextInt();
h=sc.nextInt();
i=sc.nextInt();
System.out.println( a * e * i + d * h * c + g * b * f - c * e * g - b * d * i - a * f * h );
}
}
}

ITSA50 Problem1 字母往前移

Problem 1. 字母往前移 

問題描述 : 
志明跟春嬌是班上的一對情侶,他們有寫交換日記來打發時間的習慣,為了
防止他們寫的內容被幫忙傳的同學偷看,或者是不小心被老師沒收,而曝光了裡
面寫的東西,他們想到了一個辦法,就是把內容的所有字母都往後數幾次的字母
替代,而往後數幾次的數目就寫在內容的下一行。但是,問題來了,春嬌覺得每
次寫完都要再數來數去的轉化成「加密」格式,實在是太麻煩了。但又礙於不想
被輕易的看到內容,於是她拜託你寫個程式幫忙她可以直接把寫好的內容轉化成
「加密」的型態。加密結果不會影響原字母的大小寫,且數字部分亦作相同處理,
但不處理符號及特殊字元及中文。 

輸入說明: 
第一行為想輸入的內容,不超過 100 個字元。 
第二行為打完你想輸入的內容之後,換行輸入你想要往後替代的數目。 
輸出說明: 
印出轉換後的句子,最後必須有換行字元。 
範例: 
Sample Input:                Sample Output: 
How are you? 123        Jqy ctg aqw? 345 


就像寫C一樣ascii碼轉換一下就好了

程式碼:
import java.util.Scanner;
public class ITSA50_1 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
int n=sc.nextInt();
for(int i=0;i<str.length();i++){
char ch=str.charAt(i);
int num=(int)ch;
if(num>=48&&num<=57){
num+=n;
num=num>57?num-10:num;
}else if(num>=65&&num<=90){
num+=n;
num=num>90?num-26:num;
}else if(num>=97&&num<=122){
num+=n;
num=num>122?num-26:num;
}
System.out.print((char)num);
}
System.out.println();

}


}