題目:
利用指針編寫程序
有n個學(xué)生圍成一圈,按順序排號。從第1個人開始報數(shù),凡報到3的人退出圈子,問最后留下的是原來第幾號的學(xué)生。
要求及提示:
(1)n的值輸入,輸出最后留下的學(xué)生的順序號
(2)用數(shù)組來存儲n個學(xué)生。
(3)解題思路提示
step1:先利用數(shù)組開辟足夠大的一個存儲空間,指針P指向數(shù)組;
step2:輸入n值,為這n個人編號;
step3:定義3個循環(huán)時所需計數(shù)變量
每次循環(huán)時的計數(shù)變量i,目的是控制指針是否指向了最后一個人,如果指向了最后一個人,則要使指向重新指向第一個人; 控制報數(shù)的變量k,目的是:按1、2、3報數(shù)時的計數(shù)變量。k為3時,將此人的編號設(shè)置為0,k重新計數(shù);標(biāo)識退出人數(shù)的變量m.目的是:記錄已退出多少人,為循環(huán)結(jié)束做準(zhǔn)備。
step4:循環(huán)繼續(xù)條件:n-m>1。
分析:約瑟夫問題!
-
設(shè)置控制臺顏色:
- 使用
system("color f3");設(shè)置控制臺的前景色為白色,背景色為淡藍(lán)色。
- 使用
-
變量聲明和輸入:
- 聲明整數(shù)變量
i、k、m、n,以及整數(shù)數(shù)組num和指針p。 - 用戶輸入變量
n表示總?cè)藬?shù)。
- 聲明整數(shù)變量
-
填充數(shù)組:
- 使用循環(huán)將數(shù)組
num填充為1到n的整數(shù)。
- 使用循環(huán)將數(shù)組
-
模擬報數(shù)和出局:
- 使用
i進(jìn)行循環(huán)遍歷數(shù)組,k記錄報數(shù),m記錄出局人數(shù)。 - 如果當(dāng)前元素不為0,說明該人還在圈內(nèi),增加
k。 - 當(dāng)
k達(dá)到3時,表示該人出局,將該位置的元素置為0,k歸零,m增加1。 - 循環(huán)直到
m達(dá)到n-1,即只剩下一個人。
- 使用
-
找到最后剩下的人:
- 利用循環(huán)找到數(shù)組中第一個不為0的元素,輸出即為最后剩下的人的編號。
代碼:
int main()
{
system("color f3");
int i, k, m, n, num[50], * p;
printf("input the number of n:");
scanf("%d", &n);
p = num;
for (i = 0; i < n; i++)
*(p + i) = i + 1;
i = 0;
k = 0;
m = 0;
while (m < n - 1)
{
if (*(p + i) != 0)
k++;
if (k == 3)
{
*(p + i) = 0;
k = 0;
m++;
}
i++;
if (i == n) i = 0;
}
while (*p == 0) p++;
printf("%d", *p);
return 0;
}
- 在實現(xiàn)約瑟夫環(huán)問題時,需要注意數(shù)組的下標(biāo)和循環(huán)變量的控制,確保正確模擬報數(shù)和出局的過程。
- 輸入的人數(shù)
n應(yīng)該合法,不能為負(fù)數(shù)或零。 - 由于代碼中使用了
system("color f3");,這段代碼在不同的編譯環(huán)境中可能表現(xiàn)不同,有些編譯器可能不支持該語句,或者在非Windows環(huán)境下可能不生效。這部分代碼主要是用于設(shè)置控制臺顏色,如果不需要可以移除或替換為其他合適的設(shè)置。
浙公網(wǎng)安備 33010602011771號