列出排列组合2^n种可能的方法

本文介绍了使用C语言实现n位二进制数的所有可能组合,并通过两种不同的方法实现了按降序输出的需求。第一种方法直接输出二进制数,第二种方法通过数组处理实现了有序输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  被这个问题困扰了好久,只能做到输出n固定时的组合情况,今天看到了才恍然大悟,原来是用数字逻辑表示二进制数的方法来做的。
  上代码:

#include "stdio.h" 
#include "math.h"

int main()
{
    int n, max, temp, i;
    printf("n:");
    scanf("%d", &n);
    max = pow(2, n);
    while (--max >= 0)
    {
        i = 0;
        temp = max;
        while(temp)
        {           
            printf("%d", temp % 2);
            i++;
            temp = temp / 2;
        }
        while(i++ < n)  printf("0");
        printf("\n");
    }
    return 1;
}

  用短除法算出每一个二进制数。
  但是从树的角度看,其“遍历”的顺序是从叶子到根,不能边循环边遍历。而且这样输出的2^n个数的顺序不对。所以增加一个数组,使其能按照降序输出:

#include "stdio.h" 
#include "stdlib.h"
#include "math.h"

int main()
{
    static int n;
    int max, flex, i;
    printf ("n:");
    scanf ("%d", &n);
    int *temp1 = (int*)malloc(n * sizeof(int));
    int *temp2 = (int*)malloc(n * sizeof(int));
    max = (int)pow(2, n);
    while (--max >= 0)
    {
        for (int k = 0; k < n; k++)
        {
            temp1[k] = temp2[k] = 0;    
        }
        i = 0;
        flex = max;
        while (flex)
        {           
            temp1[i] = flex % 2;
            flex = flex / 2;
            temp2[n-i-1] = temp1[i];
            i++;
        }
        for (int k = 0; k < n; k++) 
        {
            printf ("%d", temp2[k]);
        }
        printf ("\n");
    }
    return 1;
}

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值