鱼C论坛

 找回密码
 立即注册
查看: 4389|回复: 6

较难的C语言题目 (最好不使用递归)

[复制链接]
发表于 2012-3-8 18:27:17 | 显示全部楼层 |阅读模式
40鱼币
                      一个很大的操场上有500个同学,围成一个很大的圈他们从第一个同学开始报数,第一个同学报1,第二个同学报2,第三个同学报3,然后第四个同学,回过头来继续报1,第五个继续报2,以此类推。然后报到500的时候,每个报到3的同学,退出这个圈子,然后剩下的接着按照上面的方法继续报,报完了。报到三的同学继续退出。然后剩下的接着报1,2,3然后报道三的同学接着退出, 请问 最后剩下那个同学依然留在这个圈子里?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-8 18:27:18 | 显示全部楼层
  1. /////turn 500 1,2,3 3 out continue

  2. typedef struct
  3. {
  4.     int isout;
  5.         int num;
  6. }person;

  7. #include<stdio.h>
  8. void main(void)
  9. {
  10.         person p[500];
  11.         int i,j;
  12.         int outnum=0;
  13.         for(i=0;i<500;i++)
  14.         {
  15.                 p[i].isout=0;
  16.                 p[i].num=i+1;
  17.         }
  18.         i=-1,j=0;
  19.         while(outnum!=499)
  20.         {
  21.                 i++;
  22.                 if(0==p[i].isout)
  23.                 {
  24.                         j++;
  25.                         if(3==j)
  26.                         {
  27.                                 p[i].isout=1;
  28.                                 outnum++;
  29.                                 j=0;
  30.                         }       
  31.                 }
  32.                 if(499==i)
  33.                 {
  34.                         i=-1;
  35.                 }
  36.         }
  37.         for(i=0;i<500;i++)
  38.         {
  39.                 if(0==p[i].isout)
  40.                 {
  41.                         printf("留下的人是第%d号",p[i].num);
  42.                 }
  43.         }
  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-8 18:46:57 | 显示全部楼层
剩2个吧。报到3的都出去了,所以不会剩下第三个人。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-8 22:39:23 | 显示全部楼层
本帖最后由 小青鱼 于 2012-3-8 22:47 编辑

看到这道题,想起大一的时候写过,翻了原来的代码,发现和楼上的差不多,
但还是有点差别,应该是空间和时间的差别吧:
  1. #include<stdio.h>
  2. #define NUM 500
  3. void main()
  4. {
  5.   int a[NUM],count=0,k=1,i;
  6.   for(i=0;i<NUM;i++)
  7.   a[i]=i+1;
  8.   while(count!=NUM-1)
  9.   {
  10.   for(i=0;i<NUM;i++)
  11.    if(a[i]!=0)
  12.    {
  13.     if(k!=3)
  14.        k++;
  15.     else
  16.     {
  17.     a[i]=0;
  18.           count++;
  19.     k=1;
  20.     }
  21.    }
  22.    
  23.   }
  24.    for(i=0;i<NUM;i++)
  25.    if(a[i]!=0)
  26.    {
  27.      printf("The last people is %d",a[i]);
  28.      break;
  29.    }
  30. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-9 17:37:40 | 显示全部楼层
#include <stdio.h>
#define STU_NUMS 500        // 学生数

int main()
{
        int i;
        int count = 0;                // 计数
        int quitStu = 0;        // 统计已经退出的学生数
        int stus[STU_NUMS];        // 学生

        // 学生初始化
        for (i = 0; i < STU_NUMS; ++i)
        {
                stus[i] = i+1;
        }

        i = 0;
        while (quitStu < STU_NUMS-1)        // 当只剩下一个学生时退出循环
        {
                while (!stus[i])                        // 找到未退出的学生
                {
                        ++i;
                        if (i >= STU_NUMS)        // 找到末尾则重头开始
                                i = 0;
                }
                ++count;
                if (count%3 == 0)                // 是3的倍数
                {
                        ++quitStu;
                        stus[i]        = 0;                // 报3的学生以赋值为0的方式标志其退出
                }
                ++i;
                if (i >= STU_NUMS)        // 找到末尾则重头开始
                {
                        i = 0;
                }
        }
        i = 0;
        while (!stus[i] && i< STU_NUMS)                        // 找到最后一个学生
        {
                ++i;
        }
        printf("最后剩下第%d学生", i+1);

        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-9 22:57:52 | 显示全部楼层
LZ百度下“约瑟夫环”,这个是经典问题,能百度到很多经典代码基本5,6行就搞定了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 15:46:53 | 显示全部楼层
长长见识。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-11 23:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表