作為我自己編碼挑戰的一部分,我一直試圖在一行中為簡單的問題撰寫代碼。目前,我正在嘗試列印出兩個骰子可能的所有排列。到目前為止,我有一個使用兩個 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
為了讓這個挑戰更難,我試圖以與上面的輸出相同的順序列印出排列,只使用一個回圈。我確定我需要使用除法和取模來實作這一點,但我被卡住了,不確定如何實作這一點。
uj5u.com熱心網友回復:
2 回圈版本是最易讀的。但既然你問了,這里有一些 1 回圈版本:
int main()
{
int n = 6;
for (int i = 1, j = 1; i < n; j)
{
if (j > n)
{
i;
j = i;
}
std::cout << i << " " << j << '\n';
}
std::cout << std::flush;
}
int main()
{
int n = 6;
int i = 1;
int j = 1;
while (true)
{
if (j > n)
{
i;
j = i;
}
if (i > n)
{
break;
}
std::cout << i << " " << j << '\n';
j;
}
std::cout << std::flush;
}
作為旁注:
for(int i = 1; i <= 6; i ) for(int j = i; j <= 6; j ) printf("%d %d", i, j);
這太可怕了。永遠不要寫這樣的代碼。在一行中撰寫代碼的人為目標是完全沒有意義的。您可以毫不費力地將任何代碼放在這樣的一行上,因此它絕對沒有任何好處,無論是教學還是其他方面。
有撰寫單行的概念,但這不僅僅是用空格替換源代碼中的新行。它是關于例如用函式呼叫或鏈呼叫替換回圈。
不要忘記,首先要撰寫正確、干凈和可讀的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340732.html
