《C语言名题精选百则----10》

来源:互联网 发布:养鸡场源码 编辑:程序博客网 时间:2024/05/16 01:45

呃,怎么说呢,这本书的前面写着,不必按照书的安排顺序,可以自由选择顺序阅读。

我承认,我对数值问题实在是不感兴趣,于是今天跳到了第三章。

上一篇是11,这个我也数不清是多少了,干脆写成10,这样的话,不论用什么顺序,只要什么时候这个数字凑成100,这本书算是做过一遍来了。

废话少说,先上题目:



先不要看下面,给你半小时,你能想出一个好的想法吗?

反正我没有想出,答案确实很精妙,看看吧:

源代码无法正常显示就点击右键 ->查看源代码。

#include<stdio.h>#include<stdlib.h>#define MAXSIZE 20#define LOOP 1int 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;elsedigit[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为什么也正常运行呢(我想答案是虽然可以运行但是不可靠)?虽然很长时间没有算出结果。。。

原创粉丝点击