呃,怎麼說呢,這本書的前面寫着,不必按照書的安排順序,可以自由選擇順序閱讀。
我承認,我對數值問題實在是不感興趣,於是今天跳到了第三章。
上一篇是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爲什麼也正常運行呢(我想答案是雖然可以運行但是不可靠)?雖然很長時間沒有算出結果。。。