n個人圍成一圈,1 3報數,報到3的退出圈外,如此迴圈,最後哪個人留下?(用指標解決)

2021-06-17 07:28:33 字數 5573 閱讀 9795

1樓:

你這裡有明顯的死迴圈。

你把i地址給了select(),但是你在select()當中從來就沒有改變過i的值,那就是說無論執行多少次,你的i始終都是20,那你就一直在while()裡面轉了啊。

2樓:

用c寫了個例子 你跑跑看效果

-------------------------#include

main()

if(array[i]!='\0')}}

for(i=0;i

c語言編寫n個人圍成一圈,按1、2、3報數,報到3的人退出,求最後留在圈中的人是最初n個人中的第幾個(用指

3樓:匿名使用者

此題可用數學方法求解。

設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數    (用數學方法解的時候需要注意應當從0開始編號,因為取餘會取到0解。)

實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關係式。

假設除去第k個人,則

0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1          // 原始序列 (1)

0, 1, 2, 3, ..., k-2,      , k, ..., n-1        // 除去第k人,即除去序號為k-1的人   (2)

k, k+1, ..., n-1,    0,    1,        ..., k-2  // 以序號k為起始,從k開始報0  (3)

0, 1,     ..., n-k-1, n-k, n-k+1, ..., n-2   // 作編號轉換,此時佇列為n-1人  (4)

變換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,

((n-3)+k)%n=k-3,((n-2)+k)%n=k-2, 對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k,  (1+k)%n=k+1,  故可得出規律:

設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.

設x為最終留下的人序號時,佇列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。

#include

const int m = 3;

int main()

4樓:手機使用者

以前做過的,貼一個給你,人數和報的數都可以輸入的 #include#include//應用函式呼叫來實現

void fun_kill(int *pa,int n,int m)i=0;int mcount=0;

int icount=0;

while(icount人數小於總人數if(mcount==m)i++;//報數的同時指標也開始走動if(i==n)}for(i=0;i

scanf("%d",&n);

printf("請輸入要報的數:");

scanf("%d",&m);

int *pkill=(int *)malloc(sizeof(int)*n);

fun_kill(pkill,n,m);

有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出 圈子,問最後留下的是原 5

5樓:

呵呵,同一個人啊

我還是貼出來吧

#include

void main()

i++;//將指標後移,雖然i不是指標,但p+i就是指標了,所以i就是為指標服務的

if(i==n)//如果指標移到了尾部,則返回到頭部i=0;

}//以上的迴圈是主要焦點,後面的就是找出最後那個人,這個好理解while(*p==0)//用這個可以只判斷所找號的前面的號(包括所找號),不用判斷後面的。

p++;

printf("the last one is n0.%d\n",*p);}

6樓:徐臨祥

第一步:設計一個陣列a[n],將陣列的元素全部初始為0.

第二步:迴圈計數i和j,如果a[i]全為0則j到3就讓a[i]=1,如果中間有a[i]=1,跳過這個計數,j繼續增長直到3再執行a[i]=1

第三步:在第二步的同時判斷i是否迴圈到陣列的終點,即不能超過a的長度,否則將i置0繼續迴圈遍歷陣列,執行第二步。

第四步:輸出最後一個元素的位置+1就是最後一個人 (因為陣列是從0開始計數的)0

7樓:文心雕龍

# include

void main()

i++;

if(i == n) i = 0;

}while(!(*p)) p++;

printf("最後留下的是原來第%d號的那位\n",*p);

}希望對你有幫助!

有n個人圍成一圈,順序排號,從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的

8樓:匿名使用者

弄個三bai元陣列,a[x][y][z],dux儲存它的原序zhi號(即dao1~n),y儲存數數時的序號(即1、專2、3),z儲存該數是否屬曾為3(初始值為0,成為3撥為1)。先令m=n,再巢狀迴圈,外迴圈判斷m是否為1,為1即得到結果跳出迴圈,不是則進入內迴圈,並分類討論(先判斷z是否為1,是的話下一個),關鍵**如下

if(z!=1)

else

}else

else }}

else

else

}最後輸出x的值。你試試吧。(我這段**還能優化,你自己嘗試優化它吧)

9樓:匿名使用者

法一(模擬法):

#include

using std::cin;

using std::cout;

int main()

bool * a = new bool [n+1];

a[0]=false;

for(int i=1;in) x=1;//當人員到達陣列尾,序號重設為1

if(a[x])i++; // 跳過已退出人員

if(i==3)

//當數到3時,退出人員設為false,剩餘人數減1,i設為0,重新計數

}cout<<"留下來的人序號為: "<

法二(遞迴法):

此題可用數學方法求解。

設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數  (用數學方法解的時候需要注意應當從0開始編號,因為取餘會取到0解。)

實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關係式。

假設除去第k個人,則

0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1          // 原始序列 (1)

0, 1, 2, 3, ..., k-2,      , k, ..., n-1        // 除去第k人,即除去序號為k-1的人   (2)

k, k+1, ..., n-1,    0,    1,        ..., k-2  // 以序號k為起始,從k開始報0  (3)

0, 1,     ..., n-k-1, n-k, n-k+1, ..., n-2   // 作編號轉換,此時佇列為n-1人  (4)

變換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看

出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,((n-3)+k)%n=k-3,((n-2)+k)%n=k-2,

對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k,  (1+k)%n=k+1,  故可得出規律:

設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.

設x為最終留下的人序號時,佇列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。

#include

const int m = 3;

int main()

10樓:匿名使用者

連結抄;www.ff662.com(複製貼上即可)--

-意動用襲法,是指謂語動詞對於它的賓語含有“認為”,“以為”的意思.這種用法僅限於形容詞和某些表心理活動的動詞,它們本不帶賓語,帶了賓語,並具有“認為”,“以為”意義,即是意動用法.

名詞意動用法 在文言文中,有些名詞帶上賓語後,表示主語把賓語當作是什麼.形容詞的意動用法所謂形容詞的意動用法,是指不是說使賓語所代表的人或事物具有這個 形容詞所表示的性質或狀態,而是在主觀上認為他具有這種性質或狀態.例如:

左右以君賤之也,食以草具.(《戰國策·齊策四》)

▼名詞的意動用法

所謂名詞的意動用法,就是把賓語所代表人或事物看成為這個名詞所表示的人或事物.例如:

故人不獨親其親,不獨子其子.(《禮記·禮運》)

c語言有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報 數)凡報到3的人退出圈子麻煩註釋下**

11樓:凌亂心扉

#include

#define n 5//人數

void main()

,i=0,out_n=0,call_n=0,*p;

p=a;

while(1)//為0(即3)出局

}p++;if(p==a+n)p=a;//迴圈轉向下一人

}printf("最後剩餘者的編號是:%d\n",p+1-a);

}printf()函式是格式化輸出函式,一般用於向標準輸出裝置按規定格式輸出資訊。在編寫程式時經常會用到此函式。

函式的原型為:int printf(const char*format,...);函式返回值為整型。若成功則返回輸出的字元數,輸出出錯則返回負值。

printf()函式的呼叫格式為:

printf("<;格式化字串》",《參量表》);

其中格式化字串包括兩部分內容:一部分是正常字元;這些字元將按原樣輸出;另一部分是格式化規定字元,以"%"開始,後跟一個或幾個規定字元,用來確定輸出內容格式。

參量表是需要輸出的一系列引數,其個數必須與格式化字串所說明的輸出引數個數一樣多,各引數之間用","分開,且順序一一對應,否則將會出現意想不到的錯誤。

規定符%d十進位制有符號整數

%u十進位制無符號整數

%f浮點數

%s字串

%c單個字元

%p指標的值

%e指數形式的浮點數

%x,%x無符號以十六進位制表示的整數

%o無符號以八進位制表示的整數

%g把輸出的值按照%e或者%f型別中輸出長度較小的方式輸出

%p輸出地址符

%lu 32位無符號整數

%llu 64位無符號整數

人手拉手圍成一圈有多少種,5個人手拉手圍成一圈有多少種

5 4 3 2 1 120 因為圍成一圈,所以他有一個固定的開頭,把甲設為固定的開頭,再拍剩下的,共4 3 2 1 24 5人圍成一圈就坐,有多少種不同的方法?有120種 5 4 3 2 1 120種 我暈,你這分不好拿啊,就一種 因為是 一個圈 五個人手拉手圍成一圈不鬆手怎麼背對背?從兩個人中間牽...

多少名小朋友手拉手圍成一圈周長大約是10米

幼兒園小朋友身高大約1米,兩臂長為等於身高,需要10名小朋友。幾個小朋友手拉手圍一圈,周長大約是10米?正常人的臂伸展和身高一樣,如果小朋友高度都是大約1米的話,大約需要10個小朋友就可以圍成10米周長的一圈。不可能是釐米或分米,肯定是米。8個同學手拉手圍成一圈,周長大約是多少米?這個問題應該在詳細...

包皮手術後13天了,繫帶下面腫了一圈,這個時間長了能消下去嗎

做完手術應該臥床休息的,你長期坐立對於 的血液迴圈有影響,你可以洗澡,現在你的 屬於獲得性水腫性蕁麻疹,你可以搜尋相關 及資料,進行對比確認,你應該馬上服用抗過敏藥物,比如,開瑞坦,錄雷他定,西替利嗪,撲爾敏,隨便一種都可以 你這種情況,最多2 3天一定會好。而且馬上止癢,可能一兩個小時水腫現象就會...