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 语言编写的。
首先构建一个包含所有允许数字的正则表达式。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)
。将每个数字写成一个字符串,看看它是否与正则表达式匹配——如果匹配,你就有一个结果。
推荐阅读
- html - 如何在编辑模式下检测预填充的 Angular 反应表单中的更改
- swift - “inout”破坏了我的功能。我做错了什么?
- vue.js - 请求头域授权
- visual-studio-2019 - Visual Studio 项目参考中的警告标志是什么意思?
- javascript - 使用一个事务后阅读事务中的附加文档。已获取
- android - 为什么我不能在真机上调试安卓应用?
- c# - Automapper 继承 NullReferenceException
- azure - 如何在不同存储库中的管道之间共享文件?
- sql-server - 使用 Debezium 将 MSSQL CDC 流式传输到 AWS MSK
- security - 我的键盘的自定义映射可以保护我免受键盘记录器的侵害吗?
感谢您抽出时间来阅读。我正在做一个更大的项目,该项目需要一个根据标题中描述的规则生成所有数字的函数。如果输入为 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 语言编写的。
首先构建一个包含所有允许数字的正则表达式。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)
。将每个数字写成一个字符串,看看它是否与正则表达式匹配——如果匹配,你就有一个结果。
推荐阅读
- html - 如何在编辑模式下检测预填充的 Angular 反应表单中的更改
- swift - “inout”破坏了我的功能。我做错了什么?
- vue.js - 请求头域授权
- visual-studio-2019 - Visual Studio 项目参考中的警告标志是什么意思?
- javascript - 使用一个事务后阅读事务中的附加文档。已获取
- android - 为什么我不能在真机上调试安卓应用?
- c# - Automapper 继承 NullReferenceException
- azure - 如何在不同存储库中的管道之间共享文件?
- sql-server - 使用 Debezium 将 MSSQL CDC 流式传输到 AWS MSK
- security - 我的键盘的自定义映射可以保护我免受键盘记录器的侵害吗?