c++试题
1到14个人围成一个圈,从1开始报数,报到3的人就退出,
下一个人接着重新从1开始报数,直到最后只剩下一个人时结束,
输出依序退出的人的编号,以及最后剩下的人的编号。
谁能给个最精简的答案!
下面是我的答案又出在哪里!:
#include <iostream>
using namespace std;
int main()
{
char j[14];
int k=0,p=1,i=0,m=1,l(14);
cout<<"请给这14个人赋编号,一定不要重复!(且不能为0)"<<endl;
while(i<14)
{
cin>>j[i];
i++;
}
i=1;
for(i;l>=3;i++,k++)//l记住还剩多少人员!
{
if(j[k]=='0')
{
while(j[k]=='0')
{
k++;
}
}
if(i==3)
{
if(l==3)
cout<<"最后一"<<"个输出的人员"<<"的编号为:"<<j[k]<<endl;
else
{
cout<<"第"<<p<<"个输出的人员"<<"的编号为:"<<j[k]<<endl;
j[k]=='0';
}
l--;
p++;
i=0;
}
if(k==13)
k=-1;
}
system("pause");
return 0;
} c++
[解决办法]
代码不好懂,都是单个字符的变量名……
而且,内建类型的初始化不要用构造函数形式,不是计数循环就不要用for,很影响可读性。
cout<<"第"<<p<<"个输出的人员"<<"的编号为:"<<j[k]<<endl;
j[k]=='0';
cout<<"第"<<p<<"个输出的人员"<<"的编号为:"<<j[k]<<endl;
j[k]='0';
while(j[k]=='0')
{
k++;
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
const int n = 14;
vector<int> vec;
for(int i=1; i<=n; i++)
{
vec.push_back(i);
}
int i = 1;
vector<int>::iterator iter = vec.begin();
while(true)
{
if (vec.size() == 1)
{
cout << *(vec.begin()) << endl;
break;
}
if(3 == i)
{
iter = vec.erase(iter);
i=1;
}
else
{
iter++;
i++;
}
if (vec.end() == iter)
{
iter = vec.begin();
}
}
return 0;
}
#define NUM 14
int main()
{
int n[NUM] = {0};
int nCount = 0; // 记录输出次数
int i = 0;
int nStep = 3; // 跳跃量,提高效率
int nTemp = i;
while (nCount != NUM)
{
nTemp = i;
i = (i + nStep)%NUM;
if (nTemp + nStep > NUM)
{
nStep++;
}
while(1)
{
if (n[i] == 0)
{
printf("%d " ,i);
n[i] = -1;
nCount++;
break;
}
else
{
i = (i + 1)%NUM;
}
}
}
return 0;
}
#define NUM 14
int main()
{
int n[NUM] = {0};
int nCount = 0;
int i = 0;
int nStep = 3;
int nTemp = 0;
while (nCount != NUM)
{
while(1)
{
if (n[i] == 0 )
{
nTemp++;
if (nTemp == 3)
{
printf("%d " ,i+1);
n[i] = -1;
nCount++;
nTemp = 0;
break;
}
}
i = (i+1)%NUM;
}
i = (i+1)%NUM;
}
return 0;
}
//假设有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();
}
#define NUM 14
int main()
{
vector<int> m(NUM ,0);
for (int i = 0; i != NUM; i++)
{
m[i] = i+1;
}
vector<int>::iterator it = m.begin();
while (!m.empty())
{
for (int j = 0; j != 2; ++j) // 迭代器自增两次
{
if (it == m.end())
{
it = m.begin();
}
it++;
}
if (it == m.end())
{
it = m.begin();
}
printf("%d " ,*it);
it = m.erase(it);
}
return 0;
}
#include <iostream>
using namespace std;
const int N = 14;
int main(){
int i, j, k;
for(i = 1; i <= N; ++i){
for(j = N - i + 1, k = -1; j <= N; ++j) k = (k + 3) % j;
cout<<"第"<<i<<"个退出的人的编号是"<<k + 1<<endl;
}
return 0;
}