You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:编写生成n个数字升序无重复组合的C语言函数

修正升序数字组合生成函数的逻辑问题

问题分析

需要实现一个函数,输出n个不同数字的严格升序组合(无重复数字,后一位数字大于前一位),并按数值从小到大的顺序排列。例如n=2时,组合应包含01、02…09、12、13…89,且不能出现11、22这类重复数字的组合。原代码的核心问题在于:

  • 无法正确更新后续数位,保持严格递增的最小状态
  • 循环终止条件不明确,可能导致无限循环
  • 逗号输出逻辑错误,会在末尾生成多余符号

修正后的代码

void ft_putchar(char a)
{
    write(1, &a, 1);
}

void ft_print_combn(int n)
{
    int combn[n];
    int p;
    int is_last;

    if (n <= 0 || n >= 10)
        return;

    // 初始化第一个严格递增组合(数值最小)
    p = 0;
    while (p < n)
    {
        combn[p] = p;
        p++;
    }

    while (1)
    {
        // 打印当前组合
        p = 0;
        while (p < n)
        {
            ft_putchar(combn[p] + '0');
            p++;
        }

        // 判断是否为最后一个组合,是则退出循环
        is_last = 1;
        p = 0;
        while (p < n)
        {
            if (combn[p] != 9 - n + 1 + p)
            {
                is_last = 0;
                break;
            }
            p++;
        }
        if (is_last)
            break;

        // 输出分隔符(仅非最后一个组合时)
        ft_putchar(',');
        ft_putchar(' ');

        // 找到可递增的数位,更新组合为下一个严格递增状态
        p = n - 1;
        while (p >= 0)
        {
            // 当前数位的最大允许值:保证后续数位仍能严格递增
            if (combn[p] < 9 - (n - 1 - p))
            {
                combn[p]++;
                // 将后续数位设为前一位+1,保持最小递增状态
                int q = p + 1;
                while (q < n)
                {
                    combn[q] = combn[q - 1] + 1;
                    q++;
                }
                break;
            }
            p--;
        }
    }
}

int main()
{
    ft_print_combn(2);
    return 0;
}

关键修正点说明

  1. 组合更新逻辑:

    • 从最后一位向前遍历,找到第一个可以递增的数位(该数位未达到其最大允许值,最大允许值需保证后续数位仍能严格递增)
    • 递增该数位后,将后续所有数位设置为前一位+1,确保生成的是当前状态下的下一个最小严格递增组合。例如n=2时,09的下一个组合是12,符合需求。
  2. 循环终止条件:

    • 通过判断当前组合是否为最大可能的严格递增组合(如n=2时为89,n=3时为789),避免无限循环。最大组合的每一位满足公式 combn[p] = 9 - n + 1 + p。
  3. 分隔符输出控制:

    • 仅在当前组合不是最后一个时输出逗号和空格,避免末尾出现多余的分隔符号。

内容的提问来源于stack exchange,提问作者Diego Nogueira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:25:27