呃,怎么说呢,这本书的前面写着,不必按照书的安排顺序,可以自由选择顺序阅读。
我承认,我对数值问题实在是不感兴趣,于是今天跳到了第三章。
上一篇是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为什么也正常运行呢(我想答案是虽然可以运行但是不可靠)?虽然很长时间没有算出结果。。。