代码求解 ,在线等啊
#include<iostream>
using namespace std;
int main()
{
int a[21],i,j=1,k,x=21,n=0;
for(i=0;i<21;i++)
a[i]=i+1;
do
{
n=n+x;
for(k=0,x=0;k<21;k++)
{
if(a[k]%5==0)
a[k]=0;
else {
if(a[k]) x++;
}
}
for(k=0;k<21;k++)
if(a[k])
{
a[k]=a[k]+n;
if (x==1) break;
}
}while(x==1);
cout<<k;
}
21人围成一个圈,编号依次为1~21.从第一号开始报数,报到5的倍数的人离开,一直报下去直到最后只剩一个人,求出此人的编号
上面为我写的代码,不知在哪里错了,已经浪费很多时间了,希望好心人帮个忙,解决一下,谢谢了!!!!
[解决办法]
是不是x的问题 我的理解你的代码的意思是x还在的个数,比如说 a【4】离开了第二次 -1 第三次还 -1
这就是个约瑟夫环问题吧网上好多的。你先用你的逻辑先把少数的走通吧。再弄21个。 呵呵。
[解决办法]
你的算法思路本身就是错的。
你想把一轮筛过之后的序号加上本轮初始人数,认为那就是新的序号了。但这显然是错误的,你看:
1 2 3 4 5 6 7 8 9 10......
第一轮后:
22 23 24 25 0 27 28 29 30 0......
这不是你想要的结果吧?
[解决办法]
#include<stdio.h>
int main()
{
int n,s,m,i,j,a[20000];
while(scanf("%d%d%d",&n,&s,&m)!=EOF)
{
j=s;
for(i=0;i<n;i++)
a[i]=i+1;
while(n>1)
{
j=(j+m-1)%n;
if(j==0)
j=j+n;
for(i=j;i<n;i++)
a[i-1]=a[i];
n--;
}
printf("%d\n",a[0]);
}
}
[解决办法]
[解决办法]
按照你的思想你的程序会陷入死循环的,从1报到21之后,会有5号、10号、15号、20号离开,那么剩下的就得从22开始报数,以此类推下去就会陷入死循环,因为a[k]=a[k]+n;改变了数组中的值,有些值可能永远达不到5的倍数,
你是不是理解错题意了,应该是从1报到21之后,5的倍数退出后,然后再重新给剩下的人编号,编号为1到17,以此类推下去,才有可能只剩下一个人
[解决办法]
3楼的代码有错,在删除了本次最大编号的人后会导致后续编号出错。幸运的是居然没有影响到计算结果......
下面是更正后的优化代码:
- C/C++ code
#include<iostream>using namespace std;int main(){ int a[21],i,k=0,x=21,n; for(i=0;i<21;i++) a[i]=i+1; n=x; do { if (a[k]) { if (a[k]%5==0) { a[k]=0; // 抽中的人离队 --x; // 计算剩下人数 } else a[k]=++n; // 剩下的人重新排号 } ++k%=21; // 循环推进下标 }while(x!=1); // 只剩一个人时就退出循环 k=-1; while(a[++k]==0); // 看看剩下了谁 cout<<k+1<<endl; // 剩下的人编号要比数组下标大一}
[解决办法]
- C/C++ code
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,//然后继续从1开始数数,数到第m个人退出#include <stdio.h>#include <conio.h>int i,k,t;int n,m;static char f[1001];//0该座位未出圈,1该座位已出圈void main() { while (1) { printf("Input n m(1000>=n>=m>=1):"); fflush(stdout); rewind(stdin); if (2==scanf("%d%d",&n,&m)) { if (1000>=n && n>=m && m>=1) break; } } t=0;//已出圈总人数 i=1;//座位编号 k=1;//当前要数的数 while (1) { if (0==f[i]) { if (m==k) { t++; f[i]=1; printf("%3d ",i); if (0==t%10) printf("\n"); if (t>=n) break; } k++;if (k>m) k=1; } i++;if (i>n) i=1; } cprintf("Press any key ..."); getch();}