首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++考题

2013-07-04 
c++试题1到14个人围成一个圈,从1开始报数,报到3的人就退出,下一个人接着重新从1开始报数,直到最后只剩下一

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++;
         }


跳过“空位置”还不如把出局的人从队列中移除。
这道题应该是用循环队列来解决的。先实际一个循环队列,然后再写报数游戏代码。
将输入的号码按顺序添加到循环队列中,再从头开始报数,报到三的从队列中出队,直到队列中只剩一个元素。
[解决办法]
关注思路,什么存储无所谓. 如果没出错,答案是2号

#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;
}


[解决办法]
仅供参考,最后一个输出的就是最后剩下的人的编号,编号从0~13
#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;
}


[解决办法]
约瑟夫环。。

循环队列 ,可以用数组模拟的,出局的值-1
[解决办法]
4楼有bug,看看这个,不过这个效率有待提高。
#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();
}


[解决办法]
vector版的,找一个删一个。
#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;
}


[解决办法]
基于循环链表的约瑟夫环问题求解
http://blog.csdn.net/zlhy_/article/details/8996203
基于数组的约瑟夫环问题求解,更详细,更参数化
http://blog.csdn.net/zlhy_/article/details/8489251
好用记得给分哦
[解决办法]
我也写个~,编号1-14。。

#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;
}

热点排行