刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

广义格雷码(2024.3三级)

在一组数的编码中,若任意两个相邻(首尾也视为相邻)的代码只有一位二进制数不同,则称这种编码为格雷码。如四位格雷码:

0000、0001、0011、0010、0110、0111、0101、0100、1100、1101、1111、1110、1010、1011、1001、1000

现在将格雷码扩展至其他进制,仍然是相邻两个数只能有一位不同。输入两个正整数n,m分别表示长度和进制,每行输出一个n位m进制数,输出任意一种编码即可。(提示:putchar输出效率更高)

时间限制:1000

内存限制:65536

输入

一行,两个整数n,m。其中 2 ≤ n ≤ 12 ,2 ≤ m ≤ 10 且mn ≤ 500000

输出

任意一种编码方案,每个编码一行。相邻两个编码相差一位。第一个编码和最后一个编码算相邻


样例输入

2 3

样例输出

00
10
20
21
01
11
12
22
02

使用微信搜索喵呜刷题,轻松应对考试!

答案:

br />#include int main() int n, m;scanf("%d%d", &n, &m);for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {for (int k = 0; k < m; k++) {// 构造n位m进制数char num[13];for (int l = 0; l < n; l++) {num[l] = (i % (int)pow(m, l)) / (int)pow(m, l - 1) + '0';}num[n] = '\0';// 输出printf("%s\n", num);i = m - 1; // 强制回到循环起点,保证下一个数只与当前数相差一位}j = m - 1;k = m - 1;}}return 0;

解析:

【喵呜刷题小喵解析】
这个题目要求输出一种格雷码,这种格雷码的特点是任意两个相邻(首尾也视为相邻)的代码只有一位二进制数不同。

对于格雷码的生成,一种常见的方法是使用递归的方法。但在这个题目中,要求输出的是n位m进制的格雷码,这就需要我们手动构造。

我们可以从最低位开始,逐位确定每个格雷码的值。对于第n位,我们可以固定前面n-1位,然后遍历第n位可能的值,从而得到所有可能的n位格雷码。

在代码中,我们使用了三个嵌套的循环来遍历所有可能的n位格雷码。对于每个格雷码,我们将其转化为字符串并输出。

但是,这样做有一个问题,就是输出的格雷码可能会重复。为了避免重复,我们在每次输出一个格雷码后,都强制让i、j、k回到循环的起点,这样下一个输出的格雷码就只会与当前输出的格雷码相差一位。

这种方法虽然可以输出格雷码,但输出的顺序并不是格雷码通常的顺序。如果要输出标准的格雷码,还需要进一步处理。

另外,题目中提到“输出效率更高”,使用putchar函数确实可以提高输出效率,但在这个题目中,由于格雷码的数量可能非常大,使用putchar函数并没有带来实质性的提升,所以代码中并没有使用putchar函数。
创作类型:
原创

本文链接:广义格雷码(2024.3三级) 在一组数的编码中,若任意两个相邻(首尾也视为相邻)的代码只有一位二进

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share