如何仅使用单循环按指定顺序输出两个骰子的所有排列结果
解决方案
你需要的单个循环实现可以通过两种思路完成,都能输出和原有逻辑完全一致的结果:
思路1:利用状态变量自增(最简洁,无额外数学运算)
核心逻辑是维护两个骰子值的状态,每次循环后更新第二个骰子值,当第二个骰子超过6时,重置第一个骰子+1,第二个骰子和第一个骰子对齐,总共循环21次(两个骰子非降序组合总数为6*7/2=21)。
普通单循环写法
int i = 1, j = 1; for (int k = 0; k < 21; k++) { printf("%d %d\n", i, j); j++; if (j > 6) { i++; j = i; } }
单行实现
for(int i=1,j=1,k=0;k<21;k++,j++>6?(i++,j=i):0) printf("%d %d\n",i,j);
思路2:除法+取模实现(符合你推测的实现方向)
核心逻辑是遍历两个骰子的全排列共36种可能,通过除法和取模拆分出两个骰子的值,只输出满足i<=j的组合即可。
普通单循环写法
for (int k = 1; k <= 36; k++) { int i = (k-1)/6 + 1; int j = (k-1)%6 + 1; if (i <= j) { printf("%d %d\n", i, j); } }
单行实现
for(int k=1;k<=36;k++,((k-1)/6+1)<=((k-1)%6+1)?printf("%d %d\n",(k-1)/6+1,(k-1)%6+1):0);
内容的提问来源于stack exchange,提问作者PolarisEmperor
相关产品推荐
相关产品推荐

