代码练习20201020-约瑟夫环

it2023-11-26  68

公式法: 问题变为(N-1)个人,报到为(M-1)的人自杀,问题规模减小了。这样一直进行下去,最后剩下编号为0的人。用函数表示:

F(1)=0

当有2个人的时候(N=2),报道(M-1)的人自杀,最后自杀的人是谁?应该是在只有一个人时,报数时得到的最后自杀的序号加上M,因为报到M-1的人已经自杀,只剩下2个人,另一个自杀者就是最后自杀者,用函数表示:

F(2)=F(1)+M

可以得到递推公式:

F(i)=F(i-1)+M

因为可能会超出总人数范围,所以要求模

F(i)=(F(i-1)+M)%i

#include <stdio.h> int main() { int n,m,s = 0; while(scanf("%d%d", &n,&m)!=EOF) { s = 0; for (int i = 2; i <= n; ++i)//至少需要两个人 s = (s+m)%i; printf("%d\n", s+1); } return 0; }

模拟法:建一个bool数组,true表示此人还活着,false表示已经自杀。可以模拟整个过程

#include<iostream> using namespace std; int main() { int N;//人的总个数 int M;//间隔多少个人 cin>>N; cin>>M; bool *p=new bool[N+1];//[1……N]为true表示此人还活着 for (int i=1; i <= N; i++) *(p+i)=true; int count=0;//统计自杀的人数 for (int i=1, j=0; ;i++)//i用来表示循环,j用来计算是不是第N个人 { if (*(p+i))//此人还活着 { j++; if (j == M) { *(p+i)=false; j=0; count++;//统计自杀的人 } if (count == N) { cout<<"最后自杀的人是:"<<i<<endl; break; } } if(i == N) i=0; } delete []p; return 0; }
最新回复(0)