感谢您抽出时间来阅读。我正在做一个更大的项目,该项目需要一个根据标题中描述的规则生成所有数字的函数。如果输入为 M=3 且 N=5 输出应为:111,112,113,114,115,121....555 对于输入 M=4 且 N=2 输出应为:1111,1112,1121...2222

很长一,c#,c"/>

首页 > 解决方案 > 生成所有长度为 M (1

感谢您抽出时间来阅读。我正在做一个更大的项目,该项目需要一个根据标题中描述的规则生成所有数字的函数。如果输入为 M=3 且 N=5 输出应为:111,112,113,114,115,121....555 对于输入 M=4 且 N=2 输出应为:1111,1112,1121...2222

很长一

问题描述

感谢您抽出时间来阅读。我正在做一个更大的项目,该项目需要一个根据标题中描述的规则生成所有数字的函数。如果输入为 M=3 且 N=5 输出应为:111,112,113,114,115,121....555 对于输入 M=4 且 N=2 输出应为:1111,1112,1121...2222

很长一段时间以来,我一直在尝试制作一个可以执行此操作的函数,但我没有成功。所以我在寻求帮助。我需要用 C 编写它,但如果你知道如何用 C++ 或 C# 修复它,我可能能够将它翻译成 C。

我没有要显示的任何代码,因为到目前为止,我主要是尝试暴力破解它,但它似乎不起作用提前感谢您的帮助!


问题可以归结为在初始迭代的最低值开始一个 M 位、基数为 N 的数字,并在后续迭代中递增它。

M 位数字可以表示为一个数组(索引从 0 到 M-1),每个数字一个元素。数组的一端将保存最低顺序(“最右边”)的数字,而数组的另一端将保存最高顺序(“最左边”)的数字。选择哪一端来保存最高位并不重要,所以让我们选择元素 0 来保存最高位。为了一般性,让我们使用从 0 到 N-1 的数字值。(原始问题的数字从 1 到 N 并不重要,因为很容易将数字值从一种方案映射到另一种方案。)

我们可以定义一个函数来将 M 位数设置为其最小值:

void num_init(unsigned int *digits, unsigned int m)
{
    while (m--)
    {
        digits[m] = 0;
    }
}

我们可以定义另一个函数来增加 M 位数字并指示该数字是否已回绕回其最小值:

int num_inc(unsigned int *digits, unsigned int n, unsigned int m)
{
    while (m--)
    {
        if (digits[m] < n - 1)
        {
            digits[m]++;
            return 0;
        }
        digits[m] = 0; // carry
    }
    return 1;
}

示例用法:

// Print all M-digit numbers with digits from 1 to N.
void list_nums(unsigned int m, unsigned int n)
{
    unsigned int digits[m];
    int wrapped = 0;

    num_init(digits, m);
    while (!wrapped)
    {
        unsigned int i;

        // output an m-digit number
        for (i = 0; i < m; i++)
        {
            // Note: Add 1 to each digit so digits run from 1 to n instead of 0 to n-1.
            printf("%u", digits[i] + 1);
        }
        // get next number
        wrapped = num_inc(digits, n, m);
        if (!wrapped)
        {
            printf(",");
        }
    }
    printf("\n");
}

注意:大于 9的输出list_nums(m, n)会很奇怪。n

标签: c#c

解决方案


如果我理解这个问题,我会用正则表达式来做。这一切都是用 C 语言编写的。

首先构建一个包含所有允许数字的正则表达式。Posix 提供了一个正则表达式库(https://www.education.io/edpresso/how-to-write-regular-expressions-in-c似乎是一个很好的介绍),因此您只需编写将是regcomp()通过遍历从 1 到 N 的数字来解析。一个适当的正则表达式将是,对于 N=20 ^(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20)+$,。这将匹配完全由任何这些字符组成的字符串。(由于在这种情况下 0 应该只在 1 或 2 之后匹配,因此枚举选项比尝试缩短正则表达式更简单)。

然后,遍历以 开头10 ^ M和结尾的数字10^(M+1)。将每个数字写成一个字符串,看看它是否与正则表达式匹配——如果匹配,你就有一个结果。


推荐阅读