求教一个使用数组解决约瑟夫循环的问题
这个好像是改动了一点的问题:题目描述有N个小孩一起玩游戏,大家围成一圈,给他们从1开始依次编号到N,现指定从第K个小孩开始报数1(按编号递增方向),当报数到M时,该小孩出...
这个好像是改动了一点的问题:
题目描述
有N个小孩一起玩游戏,大家围成一圈,给他们从1开始依次编号到N,现指定从第K个小孩开始报数1(按编号递增方向),当报数到M时,该小孩出列,然后从下一个小孩开始重新报数1,仍然是报数至M时出列,如此重复下去,直到只剩下一个小孩为止(总人数不足M时将循环报数),求最终获胜小孩的编号。
输入
第一行输入小孩的人数N (1 < N < 100)
第二行输入游戏次数S(S > 0)
接下来输入S行,每行输入此次游戏的K(1 <= K <= N)和M,中间用空格隔开
输出
输出S行,每行对应该次游戏获胜小孩的编号
样例输入
5
2
1 3
2 2
或
6
3
1 1
2 4
3 3
样例输出
4
4
输出
6
6
3
下面是我写的:
#include <stdio.h>
int main(){
int N=0;
int S=0;
int K=0;
int M=0;
int A[200]={};
int i=0;
int k=0;
int t=0;
int x=0;
int K1=0;
scanf("%d",&N);
scanf("%d",&S);
for(i=1;i<=S;i++){
scanf("%d %d",&K,&M);
for(k=1;k<=N;k++){
A[k]=1;}
int count=0;
int num=0;
while(count<N-1){
for(k=K;k<=N;k++){
if(A[k]==1){
num++;}
if(num==M){
count++;
A[k]=0;
num=0;}
if(count==N-1){
break;}}}
for(t=1;t<=N;t++){
if(A[t]==1){printf("%d\n",t);}}}
return 0;}
有时候能算对,有时候算不对甚至循环终止了,求大神指教怎么改。。。以及实在没有财富值了 展开
题目描述
有N个小孩一起玩游戏,大家围成一圈,给他们从1开始依次编号到N,现指定从第K个小孩开始报数1(按编号递增方向),当报数到M时,该小孩出列,然后从下一个小孩开始重新报数1,仍然是报数至M时出列,如此重复下去,直到只剩下一个小孩为止(总人数不足M时将循环报数),求最终获胜小孩的编号。
输入
第一行输入小孩的人数N (1 < N < 100)
第二行输入游戏次数S(S > 0)
接下来输入S行,每行输入此次游戏的K(1 <= K <= N)和M,中间用空格隔开
输出
输出S行,每行对应该次游戏获胜小孩的编号
样例输入
5
2
1 3
2 2
或
6
3
1 1
2 4
3 3
样例输出
4
4
输出
6
6
3
下面是我写的:
#include <stdio.h>
int main(){
int N=0;
int S=0;
int K=0;
int M=0;
int A[200]={};
int i=0;
int k=0;
int t=0;
int x=0;
int K1=0;
scanf("%d",&N);
scanf("%d",&S);
for(i=1;i<=S;i++){
scanf("%d %d",&K,&M);
for(k=1;k<=N;k++){
A[k]=1;}
int count=0;
int num=0;
while(count<N-1){
for(k=K;k<=N;k++){
if(A[k]==1){
num++;}
if(num==M){
count++;
A[k]=0;
num=0;}
if(count==N-1){
break;}}}
for(t=1;t<=N;t++){
if(A[t]==1){printf("%d\n",t);}}}
return 0;}
有时候能算对,有时候算不对甚至循环终止了,求大神指教怎么改。。。以及实在没有财富值了 展开
1个回答
展开全部
#include<stdio.h> int main() { int num[50],n,m,i,j; int len,start = 0,counter = 1; printf("总数 报数\n"); scanf("%d%d",&n,&m); if(n < 0 || n > 50 ) n = 50; if(m < 1 || m > n) m = n/2; printf("人数:%d,报数:%d\n",n,m); for(i = 0; i < n; ++i) num[i] = i + 1; // 预填 len = n; // len保留队列中现有人数 while(len) { if(counter == m) { printf("%d ",num[start]); for(j = start; j < len - 1; ++j) num[j] = num[j + 1]; --len; counter = 1; } else { ++counter; ++start; start %= len; } } printf("\n"); return 0;}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询