未完待續!
2. 奇怪的比賽
某電視臺舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:
每位選手需要回答10個問題(其編號爲1到10),越後面越有難度。答對的,
當前分數翻倍;答錯了則扣掉與題號相同的分數(選手必須回答問題,不回答按
錯誤處理)。
每位選手都有一個起步的分數爲10分。
某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能推斷出他
(她)哪個題目答對了,哪個題目答錯了嗎?
如果把答對的記爲1,答錯的記爲0,則10個題目的回答情況可以用僅含有1和
0的串來表示。例如:0010110011 就是可能的情況。
你的任務是算出所有可能情況。每個答案佔一行。
參考答案:
1011010000
0111010000
0010110011
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* @author guorui
* @date 2020-06-25 16:23
* @ 2. 奇怪的比賽
* 某電視臺舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:
* 每位選手需要回答10個問題(其編號爲1到10),越後面越有難度。答對的,
* 當前分數翻倍;答錯了則扣掉與題號相同的分數(選手必須回答問題,不回答按
* 錯誤處理)。
* 每位選手都有一個起步的分數爲10分。
* 某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能推斷出他
* (她)哪個題目答對了,哪個題目答錯了嗎?
* 如果把答對的記爲1,答錯的記爲0,則10個題目的回答情況可以用僅含有1和
* 0的串來表示。例如:0010110011 就是可能的情況。
* 你的任務是算出所有可能情況。每個答案佔一行。
* <p>
* 參考答案:
* 1011010000
* 0111010000
* 0010110011
*/
public class WeirdGame {
/**
* 將輸入的數字傳入,轉化爲所有全排列種數,將其轉化爲二進制形式,在for循環中,先將所有種類數字代表二進制算出,而一開始將種數最大值
* 的二進制的位數算出,用最大的位數減去每個種數對應的二進制位數,所得結果先導0的個數。將先導0放在每個種類數字對應的二進制前面
*
* @param number
* @return
*/
public static List<String> calculator(int number) {
List<String> allKind = new ArrayList<String>();
int allKinds = calculate(number);
String maxBinary = Integer.toBinaryString(allKinds);
int maxDigit = maxBinary.length();
for (int i = 1; i <= allKinds; i++) {
String everyBinary = Integer.toBinaryString(i);
int leadingZero = maxDigit - everyBinary.length();
String zero = "";
for (int j = 0; j < leadingZero - 1; j++) {
zero += "0";
}
String finalarr = zero + everyBinary;
allKind.add(finalarr);
}
return allKind;
}
/**
* 將集合中的每一個位置上的內容按爲拆開。單獨保存在新的集合中
*
* @param
*/
public static List<String> split(String str) {
List<String> list = Arrays.asList(str.split(""));
return list;
}
/**
*
*/
public static void cal(List<String> list,int finalGrade) {
for (String i : list) {
List<Integer> intList = new ArrayList<Integer>();
List<String> str = WeirdGame.split(i);
//將集合(每個位置上只有一個元素的)遍歷,賦值整形集合
for (String j : str) {
intList.add(Integer.parseInt(j));
}
// System.out.println("整形集合爲:"+intList.toString());
//遍歷每個位置上元素,計算成績
int grade = 10;
for (int i1 = 0; i1 < intList.size(); i1++) {
int number = intList.get(i1);
if (number == 1) {
grade *= 2;
}
if (number == 0) {
grade -= i1 + 1;
}
// if(i1 == intList.size()-1){
// System.out.println("得分是:"+grade);
// }
}
if (grade == finalGrade) {
System.out.println(i + "的成績是"+finalGrade);
}
// else{
// System.out.println("均無");
// }
}
}
/**
* 返回有多少種可能的排列種類,即2的多少次方
*
* @param capacity
* @return
*/
private static int calculate(int capacity) {
if (capacity == 0) {
return 1;
}
return 2 * calculate(capacity - 1);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<String> list = new ArrayList<String>();
System.out.println("請輸入需要答題的個數:");
list = WeirdGame.calculator(sc.nextInt());
System.out.println("請輸入要統計的分數:");
WeirdGame.cal(list,sc.nextInt());
// System.out.println(list.toString());
// System.out.println(list.size());
}
}
輸入10,表示2^10次共1024種可能的情況,將這些0和1的字符串放在集合中,再將集合中的每一位字符串拆開放在新集合中(此集合爲Integer),邏輯判斷得分即可
3. palindrome
Statement of the Problem We say that a number is a palindrome if it is the sane when read from left to right or from right to left. For example, the number 75457 is a palindrome. Of course, the property depends on the basis in which is number is represented. The number 17 is not a palindrome in base 10, but its representation in base 2 (10001) is a palindrome. The objective of this problem is to verify if a set of given numbers are palindromes in any basis from 2 to 16. Input Format Several integer numbers comprise the input. Each number 0 < n < 50000 is given in decimal basis in a separate line. The input ends with a zero. Output Format
11
Your program must print the message Number i is palindrome in basis where I is the given number, followed by the basis where the representation of the number is a palindrome. If the number is not a palindrome in any basis between 2 and 16, your program must print the message Number i is not palindrome.
先來一段自己的翻譯
我們把從左往右和從右往左念起來相同的數字叫做迴文數。例如,75457就是一個迴文數。
當然某個數用某個進製表示不是迴文數,但是用別的進製表示可能就是迴文數。
例如,17是用十進制表示的數,顯然它不是一個迴文數,但是將17用二進制表示出來是10001,顯然在二進制下它是一個迴文數。
現在給你一個用十進制表示的數,請你判斷它在2~16進制下是否是迴文數。
輸入:輸入包含多組測試數據。每組輸入一個用十進制表示的正整數n(0<n<50000),當n=0時,輸入結束。
輸出:對於每組輸入,如果n在2~16進制中的某些進製表示下是迴文數,則輸出“Number i is palindrom in basis ”,在後面接着輸出那些進制。其中i用n的值代替,後面輸出的進制中,每兩個數字之間空一個。
如果n在2~16進制的表示下都不爲迴文數,則輸出“Number i is not palindrom”,其中i用n的值代替。
樣例輸入
17
19
0
樣例輸出
Number 17 is palindrome in basis 2 4 16
Number 19 is not palindrome
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @author guorui
* @date 2020-06-20 15:21
* 我們把從左往右和從右往左念起來相同的數字叫做迴文數。例如,75457就是一個迴文數。
* 當然某個數用某個進製表示不是迴文數,但是用別的進製表示可能就是迴文數。
* 例如,17是用十進制表示的數,顯然它不是一個迴文數,但是將17用二進制表示出來是10001,顯然在二進制下它是一個迴文數。
* 現在給你一個用十進制表示的數,請你判斷它在2~16進制下是否是迴文數。
* 輸入
* 輸入包含多組測試數據。每組輸入一個用十進制表示的正整數n(0<n<50000),當n=0時,輸入結束。
* 輸出
* 對於每組輸入,如果n在2~16進制中的某些進製表示下是迴文數,則輸出“Number i is palindrom in basis ”,在後面接着輸出那些進制。其中i用n的值代替,後面輸出的進制中,每兩個數字之間空一個。
* 如果n在2~16進制的表示下都不爲迴文數,則輸出“Number i is not palindrom”,其中i用n的值代替。
* 樣例輸入
* 17
* 19
* 0
* 樣例輸出
* Number 17 is palindrom in basis 2 4 16
* Number 19 is not palindrom
*/
public class Palindrome {
public static void main(String[] args) {
new Palindrome().init();
}
/**
* 存放輸入輸出及判斷條件的框架
*/
public void init() {
Scanner sc = new Scanner(System.in);
List<Integer> arr = new ArrayList<Integer>();
while (true) {
System.out.println("請輸入數字:");
int number = sc.nextInt();
if (number == 0) {
System.out.println("輸入結束");
break;
} else if (number > 50000 || number < 0) {
System.out.println("對不起,您輸入的數字超出範圍,請重試!");
continue;
}
arr.add(number);
}
Palindrome t1 = new Palindrome();
t1.iterator(arr);
}
/**
* 遍歷list中每一個輸入元素
*
* @param arr
*/
public void iterator(List arr) {
for (Object number : arr) {
int count = 0;
for (int basis = 2; basis <= 16; basis++) {
StringBuffer finalNumber = new StringBuffer(Integer.toString((int) number, basis));
StringBuffer finalCount = new StringBuffer(finalNumber);
finalNumber.reverse();
if (finalNumber.toString().equals(finalCount.toString())) {
if (count == 0) {
System.out.print("Number " + number + " is palindrom in basis ");
}
System.out.print(basis + "\t");
count++;
}
// System.out.println(number+"的"+basis+"進制"+"的數字是:"+finalCount+",其迴文爲:"+finalNumber);
}
if (count == 0) {
System.out.println("\nNumber " + number + " is not palindrome ");
}
}
}
}
4. 電話號碼(其他來源,請參考)
輝子最近接到了一個棘手的任務,他們公司有一個電話簿,但是這是一個奇
怪的電話簿,因爲它不是用數字記錄電話號碼,而是用數字鍵上所對應的字母來
記錄電話號碼(2-abc,3-def,4-ghi,5-jkl,6-mno,7-pqrs,8-tuv,9-wxyz),電話號
碼只有11位。現在你的任務就是幫輝子寫一個程序來把這些字母的電話號碼轉化
成數字的電話號碼。
輸入:
第一行輸入一個正整數T(0<T<=100),表示測試數據的組數,每組測試數據只
有一行,輸入一串字符(字符長度爲11)。
輸出:
每組輸出佔一行,輸出數字的電話號碼。
例如:
樣例輸入
3
phqghumeayl
nlfdxfircvs
cxggbwkfnqd
樣例輸出
74744863295
65339347287
29442953673
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* @author Sun Weifeng
* @date 2020-06-25 16:21
*/
public class PhoneNumber {
public static void main(String[] args) {
new init();
}
}
/**
* 啓動按鍵內部類
*/
class init{
public init(){
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
List<String> stringList = new ArrayList<>();
for (int i = 0; i < num; i++) {
String string = scanner.next();
if (string.length() == 11) {
String finalString = iterator(string);
stringList.add(finalString);
} else {
System.out.println("你輸入的不是11位,請重新運行程序");
}
}
for (String s : stringList) {
System.out.println(s);
}
}
/**
* 解析字符串方法
* @param string
* @return
*/
public String iterator(String string) {
List<String> list = Arrays.asList(string.split(""));
StringBuffer stringBuffer = new StringBuffer();
for (String s : list) {
if (s.equals("a") || s.equals("b") || s.equals("c")) {
stringBuffer.append(2);
} else if (s.equals("d") || s.equals("e") || s.equals("f")) {
stringBuffer.append(3);
} else if (s.equals("g") || s.equals("h") || s.equals("i")) {
stringBuffer.append(4);
} else if (s.equals("j") || s.equals("k") || s.equals("l")) {
stringBuffer.append(5);
} else if (s.equals("m") || s.equals("n") || s.equals("o")) {
stringBuffer.append(6);
} else if (s.equals("p") || s.equals("q") || s.equals("r") || s.equals("s")) {
stringBuffer.append(7);
} else if (s.equals("t") || s.equals("u") || s.equals("v")) {
stringBuffer.append(8);
} else if (s.equals("w") || s.equals("x") || s.equals("y") || s.equals("z")) {
stringBuffer.append(9);
}
}
return stringBuffer.toString();
}
}