前言
這裏有 100 張寫着數字 1~100 的牌,並按順序排列着。最開始所有牌都是背面朝上放置。某人從第 2 張牌開始,隔 1 張牌翻牌。然後第 2,4, 6, …, 100 張牌就會變成正面朝上。接下來,另一個人從第 3 張牌開始,隔 2 張牌翻牌(原本背面朝上的,翻轉成正面朝上;原本正面朝上的,翻轉成背面上)。再接下來,又有一個人從第 4 張牌開始,隔 3 張牌翻牌( 圖1 )。像這樣,從第 n 張牌開始,每隔 n-1 張牌翻牌,直到沒有可翻動的牌爲止。
問題
求當所有牌不再變動時,所有背面朝上的牌的數字。
代碼
public class Q03 {
public static void main(String[] args) {
//0位置不用
int[] data = new int[101];
// method1(data);
method2();
}
private static void method2() {
// i 1 - 100 位置被翻的所有可能,考慮的是每牌的被翻
for (int i = 1; i < 101; i++) {
boolean flag = false;
//j=1一次不算,表示沒有翻。
//已經翻轉過的部分不再翻轉 1%1(符合) 2%1 2%2 3%1 3%3 4%1 4%2 4%4(符合).....
for (int j = 1; j < 101; j++) {
if (i%j == 0) {
flag = !flag;
}
}
if (flag) {
System.out.println(i);
}
}
}
private static void method1(int[] data) {
for (int i = 0; i < data.length; i++) {
data[i] = 0;
}
for (int i = 2; i < data.length; i++) {
int j = i;
while(j < data.length) {
data[j] = data[j] == 0 ?1:0; //data[] 類型爲int
// data[j] = !data[j]; //data[] 類型爲false
j +=i;
}
}
for (int i = 0; i < data.length; i++) {
if (data[i] == 0) {
System.out.println(i);
}
}
}
}
答案
1、4、9、16、25、36、49、64、81、100
思路改進
method2() 是用數組來實現的,但從左到右按順序處理也就意
味着“已經翻轉過的部分不再翻轉”。如果針對這一點進行優化,還可
以繼續簡化程序,如method2();
private static void method2() {
// i 1 - 100 位置被翻的所有可能,考慮的是每牌的被翻
for (int i = 1; i < 101; i++) {
boolean flag = false;
//j=1一次不算,表示沒有翻。
//已經翻轉過的部分不再翻轉 1%1(符合) 2%1 2%2 3%1 3%3 4%1 4%2 4%4(符合).....
for (int j = 1; j < 101; j++) {
if (i%j == 0) {
flag = !flag;
}
}
if (flag) {
System.out.println(i);
}
}
}