《C語言名題精選百則----10》

呃,怎麼說呢,這本書的前面寫着,不必按照書的安排順序,可以自由選擇順序閱讀。

我承認,我對數值問題實在是不感興趣,於是今天跳到了第三章。

上一篇是11,這個我也數不清是多少了,乾脆寫成10,這樣的話,不論用什麼順序,只要什麼時候這個數字湊成100,這本書算是做過一遍來了。

廢話少說,先上題目:



先不要看下面,給你半小時,你能想出一個好的想法嗎?

反正我沒有想出,答案確實很精妙,看看吧:

源代碼無法正常顯示就點擊右鍵 ->查看源代碼。

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 20
#define LOOP 1

int main()
{
	char digit[MAXSIZE];
	int i,j;
	int n;
	char line[100];
	
	printf("\nDirect Generation of All Subsets of a set");
	printf("\n=========================================");
	printf("\n\nNumber of Element in the Given set -- > ");
	gets(line);
	n = atoi(line);
	
	for(i = 0;i < n;i++)
		digit[i] = '0';
	printf("\n{}");
	while(LOOP)
	{
		for(i = 0;i < n && digit[i] == '1';digit[i] = '0',i++)
			;
		if(i == n)
			break;
		else
			digit[i] = '1';
		for(i = 0;i < n && digit[i] == '0';i++)
			;
		//for(j = n - 1;j >= 0;j--)
		//	putchar(digit[j]);
		printf("\n{%d",i + 1);
		for(j = i + 1;j < n;j++)
			if(digit[j] == '1')
				printf(",%d",j + 1);
		printf("}");
	}
}
註釋部分是我自己加的,打開之後大概可以更好理解吧。

另外還可以用unsigned long代替數組進行計算。

在這個程序裏還學到的是一個二進制數+1的實質是什麼:從右往左查,如果遇到的位數是1,就把它變成0,接着處理下一位,但是若遇到0,便把那個位數變成1,停止工作。

用這個關係就可以把數字計算轉化成字符串的變化。

子集這個東西要輸入的數最好少 一點,答案給的limit是20,但是我輸入100爲什麼也正常運行呢(我想答案是雖然可以運行但是不可靠)?雖然很長時間沒有算出結果。。。

發佈了47 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章