【发布时间】:2021-12-14 02:40:18
【问题描述】:
作为我自己的编码挑战的一部分,我一直在尝试用一行代码来解决简单问题。目前,我正在尝试打印出两个骰子的所有可能排列。到目前为止,我有一个使用两个 for 循环的简单算法:
for(int i = 1; i <= 6; i++)
for(int j = i; j <= 6; j++)
printf("%d %d", i, j);
这很容易变成一行:
for(int i = 1; i <= 6; i++) for(int j = i; j <= 6; j++) printf("%d %d", i, j);
两个程序都以所需的顺序输出排列:
1 1
1 2
1 3
1 4
1 5
1 6
2 2
2 3
2 4
2 5
2 6
3 3
3 4
3 5
3 6
4 4
4 5
4 6
5 5
5 6
6 6
为了使这一挑战变得更加困难,我试图以与上述输出相同的顺序打印出排列,只使用一个循环。我确定我需要使用除法和模数来实现这一点,但我被卡住了,不确定如何实现这一点。
【问题讨论】:
-
注意:您似乎选择的路径是黑暗面。人们应该努力编写易于阅读、理解和维护的代码,而不是局促和神秘的代码。仅在必须满足性能要求时才使代码复杂化。
-
仅供参考,空格是给人类的。编译器不需要空格(一些符号分隔规则除外)。必读:International Obfuscated C Code Contest。消除空白没有任何好处,速度或空间。就编译器而言,它仍然是相同的代码。
-
这个怎么样:
for(int i = 0; i < 36; i++) printf("%d %d\n", (i/6)+1, (i%6)+1 );它使用除法和模数,就像你期望的那样。