程序員的算法趣題 :Q3翻牌

前言

這裏有 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);
			}
		}
		
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章