打印所有真值组合的练习题

来源:互联网 发布:w10怎么卸载软件 编辑:程序博客网 时间:2024/05/10 11:52

    一个简单的练习题,用到了简单的位运算。

貌似效率不怎么样,只是觉得这个实现简单点。

对任意 n > 0,其组合数共有 2的n次方种。

 

工具:Vim + GCC。

 

 

#include <stdio.h>/* * 给定n个布尔变量(x[1]...x[n]),打印所有可能的真值组合. * 例如: n = 2时, 共有四种可能:  *     (true, true),(true, false),(false, true),(false, false) * *  Warning:请不要输入太大的 n 值,因为打印所需的时间是相当的可观; *          当 n = 25, 每秒打印100种组合, 大约需要4天...... * */void print_sequence(int n){    //n应该大于0.    if ( n <= 0 )    {        return;    }    int count = (1 << n);//组合数量计数器,即共有count种组合.    int binary_bits = 0;//(111,101,010...)布尔组合的位串.                        //因为机器原因,最多只能表示31位(有符号int类型的数据位).                        //你输入32就知道了<^_^>.                        //可以改用long, or long long以增加数据位,同时count也要改.(打印时间要以年计算了,呵呵).    int i, j, bit;    for (i = 0; i < count; i ++)    {        binary_bits = i;        printf("<<%d>>. (", (i + 1));        for (j = 0; j < n; ++j)        {            bit = binary_bits % 2;            if (bit)            {                printf("TRUE");            }            else            {                printf("FALSE");            }            if ( j < (n - 1) )            {                printf(", ");            }            binary_bits >>= 1;        }        printf(")\n");    }}//Application startint main(void){    int amount = 0;    do    {        printf("Input amount of boolean varibles:");        scanf("%d", &amount);    } while(amount <= 0);    print_sequence(amount);    getch();    return 0;}


 

输入 32 的结果

 

 

输入33的结果

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击