M个人围成一圈报数,报到N的人出列,输出出列顺序!用C语言实现! c语言,有n个人围成一圈,按顺序从1到n编好号。从第一个人开...

m\u4e2a\u4eba\u56f4\u6210\u4e00\u5708 \uff0c\u62a5\u6570\u62a5\u5230n\u7684\u4eba\u51fa\u5217 \uff0c\u76f4\u5230\u5168\u90e8\u51fa\u5217\u4e3a\u6b62\uff0c\u6c42\u51fa\u5217\u987a\u5e8f\uff08\u7528jave\u7f16\u7a0b\u89e3\u51b3\uff09

\u76f4\u5230\u5168\u90e8\u51fa\u5217\uff1f
\u8bf7\u95ee\uff0c\u7b2c\u4e00\u4e2a\u4eba\u6570\u5230n\uff0c\u540e\u8fd8\u662f\u6709\u7b2c\u4e00\u4e2a\u4eba\u5f00\u59cb\u6570\u5417\uff1f\u8fd8\u662f\u6570\u5230n\u7684\u90a3\u4e2a\u4eba\u63a5\u7740\u65701.

#include
int main()
{int m,n,a[100],out=0,i,j=0;
scanf("%d%d",&n,&m); /*\u8f93\u5165m,n*/

for(i=0;i<n;i++)
a[i]=i+1;
while(out<n)
{for(i=0;i<n;i++)
{if(a[i]!=0)
j++;
if(j==m)
{printf("%d\n",a[i]);out++;j=0;a[i]=0;} /*\u4f9d\u6b21\u6253\u5370\u9000\u51fa\u4eba\u7684\u7f16\u53f7*/
if(i==n-1) break;
}
}
i=0;
if(a[i]!=0)
{printf("%d",a[i]);i++;} /*\u6700\u540e\u6253\u5370\u5269\u4e0b\u4e00\u4eba\u7684\u7f16\u53f7*/
}

\u8bf7\u91c7\u7eb3

此题可用数学方法求解。


设有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 <stdio.h>
int main()
{    
int n,m,s=0;    
scanf("%d%d",&n,&m);    
for (int i=2;i<=n;++i)    
{s=(s+m)%i;    
printf("%d
",s+1);}    
return 0;
}


//M个人围成一圈报数,报到N的人出列,输出出列顺序

#include<stdio.h>
#define MaxNumOfPerson 100

void main()
{
int Array[MaxNumOfPerson];
int M,N;

printf("请输入报数人数(M):\n");
scanf("%d",&M);
printf("请输入报点(N):\n");
scanf("%d",&N);

for(int i= 0;i<M;i++)
Array[i]= i+1;

int Total,RecordCount;
Total = 0;
RecordCount = 0;

printf("出圈顺序为:\n");

while(Total<M)
{
for(i=0;i<M;i++)
{
if(Array[i])
{
RecordCount++;
if( RecordCount % N ==0)
{
printf("%d ",Array[i]);
Array[i] = 0;
}
}
}
}
}

//约瑟夫问题,利用二个数组,一个前指,一个后指,模拟指针。
#include<stdio.h>

#define MAX 100
int main()
{
int n,m;//n个人,报到m
scanf("%d%d",&n,&m);
int next[MAX];
int pre[MAX];
int i,k;
next[0]=1;
for(i=1;i<=n;i++) {next[i]=i+1;pre[i]=i-1;}
next[n]=1;pre[1]=n;
k=0;
while(k!=next[k])
{
for(i=1;i<=m;i++)
k=next[k];
next[pre[k]]=next[k];
pre[next[k]]=pre[k];
}
printf("%d\n");

return 0;
}

  • M涓汉鍥存垚涓鍦堟姤鏁,鎶ュ埌N鐨勪汉鍑哄垪,杈撳嚭鍑哄垪椤哄簭!鐢–璇█瀹炵幇!
    绛旓細璁炬湁n涓汉锛堢紪鍙0~(n-1)锛夛紝浠0寮濮鎶ユ暟锛屾姤鍒(m-1)鐨勯鍑猴紝鍓╀笅鐨勪汉缁х画浠0寮濮嬫姤鏁 锛堢敤鏁板鏂规硶瑙g殑鏃跺欓渶瑕佹敞鎰忓簲褰撲粠0寮濮嬬紪鍙凤紝鍥犱负鍙栦綑浼氬彇鍒0瑙c傦級瀹炶川鏄竴涓掓帹锛宯涓汉涓渶缁堢暀涓嬫潵鐨勫簭鍙蜂笌n-1涓汉涓暀涓嬫潵鐨勪汉鐨勫簭鍙锋湁涓涓掓帹鍏崇郴寮忋傚亣璁鹃櫎鍘荤k涓汉锛屽垯 0, 1, 2, 3,...
  • m涓汉鍥存垚涓鍦 ,鎶ユ暟鎶ュ埌n鐨勪汉鍑哄垪 ,鐩村埌鍏ㄩ儴鍑哄垪涓烘,姹傚嚭鍒楅『搴...
    绛旓細璇烽棶锛岀涓涓汉鏁板埌n锛屽悗杩樻槸鏈夌涓涓汉寮濮嬫暟鍚楋紵杩樻槸鏁板埌n鐨勯偅涓汉鎺ョ潃鏁1.
  • 鏈m涓汉鍥存垚涓鍦,寮濮鎶ユ暟,鎶ラ亾n,閫鍑,闂渶鍚庡墿涓嬬殑鏄嚑鍙枫(浠1鍙...
    绛旓細int m,n;scanf("%d%d",&m,&n);int a[m];int i;for(i=0; i<m; i++){ a[i]=1;} int count=1;//鎶ユ暟 int max=m;//鍑忓皯鐨勬渶澶т汉鏁帮紝鐣欎笅鏉ヤ竴涓汉 int j=0;//鏁扮粍涓嬫爣 while(max!=1) //褰撴病鏈夊噺灏戣冻澶熺殑浜烘暟鏃 { if(count==n){ printf("鍑忓幓涓涓汉锛 %d\n",j+...
  • M涓汉鍥存垚涓鍦,浠庣涓涓汉寮濮鎶ユ暟,鏁板埌n鐨勪汉鍑哄湀銆傚啀鐢变笅涓涓汉寮濮...
    绛旓細{杈撳嚭m涓嚭鍦堜汉缂栧彿} for i锛=1 to m do begin {璁℃暟娓0} s锛=0锛泏璁℃暟涓n鏃剁粨鏉焳 while s<n do begin {澶勭悊涓嬫爣} if j<m then j锛=j+1 else j锛=1 锛泏璁℃暟} s锛=s+a[j]end锛泏杈撳嚭鍑哄湀浜虹紪鍙穧 write锛坖锛3锛夛紱{璇ュ厓绱犳竻0} a[j]锛=0 end end锛巁__program ___;con...
  • M涓汉鍥存垚涓鍦,浠庣涓涓汉寮濮嬩緷娆′粠1寰幆鎶ユ暟,姣忓綋鎶ユ暟涓N鏃舵浜轰粠...
    绛旓細+i;//鍒嗗埆鏄紱A~Z } cout<<endl;for(i=0;i<N;i++)//鎶ユ暟N娆℃姤瀹,浠M寮濮 { count=M;while(count>0){ k++;if(k==N)k=0;if(line[k].flag==0)count--;num++;} cout<<line[k].c<<" "<<num<<'\t';line[k].flag=1;num=1;} return 1;} //甯屾湜鑳藉浣犳湁甯姪 ...
  • 鏈M涓汉鍥存垚涓鍦,姣忎汉涓涓殑缂栧彿(1.
    绛旓細(a+i)=i+1; //缁n 涓汉缂栧彿 i=0;k=n; //k鐢ㄦ潵浠1鍒皀璁℃暟 t=0; //t鏉ョ疮璁¢鍑虹殑浜烘暟 while(m<n) //m澧炲姞鍒15缁撴潫 {if(*(p+i)!=0)k++;if(k==n){*(p+i)=0; //閫鍑轰汉鐨勭紪鍙峰彉涓0 k=0;t++; //閫鍑轰竴涓汉 cout<<i<<" ";} i++;if(i==...
  • 绾︾憻澶棶棰榗璇█
    绛旓細printf( "绋嬪簭杩愯鍚,鍑哄垪浜虹殑椤哄簭涓:\n\n" );for( i = 0; i < total; i++ ) /* 瑕佹墦鍗皌otal涓汉鐨鎯呭喌,鏁呭仛total娆 */ { if ( arrayLen == 1 )printf( "%d", person[0] ); /* 濡傛灉鏄暟缁勫彧鍓╀竴涓厓绱,鐩存帴鍑哄垪 */ else { deleNum = ( start + overNum - 1...
  • m涓汉鍥鍩庝竴涓湀,渚濇1,2鎶ユ暟...鏁板埌3鐨勪汉閫鍑哄湀瀛,
    绛旓細int k=1;int num=n;while(num!=1){ p0=p0->next;p1=p1->next;p2=p2->next;k++;if(k==3){ p0->next=p2;free(p1);p1=p2;p2=p2->next;k=1;num--;} } printf("%d\n",p1->num);getch();return 0;} 鍓嶄袱澶╁垰鍐欎簡2閬嶏紝鏅曟鎴戜簡锛屽張鏉ャ傝緭鍏ユ绘暟锛岃緭鍑哄氨鏄粨鏋溿
  • c璇█ 鎶ユ暟闂
    绛旓細杈撳叆涓や釜姝f暣鏁 n 鍜 m( (1<m<n<=50)),鏈 n 涓汉鍥存垚涓鍦,鎸夐『搴忎粠 1 鍒 n 缂栧彿銆備粠绗竴涓汉寮濮鎶ユ暟,鎶ユ暟 m 鐨勪汉閫鍑哄湀瀛,涓嬩竴涓汉浠 1 寮濮嬮噸鏂版姤鏁,鎶ユ暟 m 鐨勪汉閫鍑哄湀瀛愩傚姝ゅ惊鐜,鐩村埌鐣欎笅鏈鍚庝竴涓汉銆傝鎸夐鍑洪『搴忚緭鍑洪鍑哄湀瀛愮殑浜虹殑缂栧彿,浠ュ強鏈... 灞曞紑 甯...
  • 楂樺垎璺眰C++楂樻墜瑙g紪绋嬮鐩
    绛旓細搴﹂珮杈綩(nm)锛屽綋n锛宮闈炲父澶(渚嬪涓婄櫨涓囷紝涓婂崈涓)鐨勬椂鍊欙紝鍑犱箮鏄病鏈夊姙娉曞湪鐭椂闂村唴鍑虹粨鏋滅殑銆備负浜嗚璁烘柟渚匡紝鍏堟妸闂绋嶅井鏀瑰彉涓涓嬶紝骞朵笉褰卞搷鍘熸剰锛氶棶棰樻弿杩帮細n涓汉锛堢紪鍙0~(n-1))锛屼粠0寮濮鎶ユ暟锛屾姤鍒(m-1)鐨勯鍑猴紝鍓╀笅鐨勪汉缁х画浠0寮濮嬫姤鏁般傛眰鑳滃埄鑰呯殑缂栧彿 銆傛垜浠煡閬撶涓涓汉(缂栧彿涓瀹氭槸m%...
  • 扩展阅读:5m圈玩法篇精品任务集 ... 0s怎么玩1m ... 两个人轮流报数1或3 ... m20螺纹尺寸对照表 ... n个人围成一圈 报数3 ... 报数1或3谁先报到30 ... 计量单位大全表mm ... m的类型k1到k9 ... n个人围城一圈报3退出 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网