这道题 我实在是不会做了 求助..

yellowq 2013-12-22 11:31:27
有n个人编号1-n,按照顺时针方向围成一个圆圈。它们预先定义好两个整数x,y。先从1号顺时针方向开始报数,报到x的人出圈,再从x的逆时针方向的后一个人从1开始报数,报到y的人出圈,再从这个人的顺时针方向后一个人开始从1报数,报到x的人出圈,如此反复,直到最后剩下一个人为止,问最后剩下的那个人是几号? 比如n = 10, x = 3, y = 2,报数的过程如下 报数人 1, 2, 3 3出圈 报数人 2,1 1出圈 接着2,4 ,5 5出圈 接着4,2 2出圈 接着4,6,7 7出圈 接着6,4 4出圈 接着6,8,9 9出圈 接着8,6 6出圈 接着8,10,8 8出圈 剩余 10号。 输入n,x,y输出剩余的编号。 数据范围 1 < n <= 1000000, 1<=x,y<=1000000000。


题目就是这样 网上的
用尽各种办法 实在是没办法了 网上没有答案 很想知道怎么做到
求大神帮忙....
...全文
765 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sec_kill 2014-02-14
  • 打赏
  • 举报
回复
引用 18 楼 sec_kill 的回复:
[quote=引用 16 楼 u013470052 的回复:] 一个数组就解决了。
我也是用一个数组解决,但是还是会超时间,毕竟数据太大,用%运算后还是超时![/quote] 不过最终套用约瑟夫环 公式 还是解决了这道题!
赵4老师 2014-02-14
  • 打赏
  • 举报
回复
sec_kill 2014-02-14
  • 打赏
  • 举报
回复
引用 16 楼 u013470052 的回复:
一个数组就解决了。
我也是用一个数组解决,但是还是会超时间,毕竟数据太大,用%运算后还是超时!
大奶兔白糖 2014-02-14
  • 打赏
  • 举报
回复
引用 13 楼 wantongtang 的回复:
用链表实现了一下,但是那个编译器好像不支持链表
编译器不支持链表?何解?
初見的畫面 2014-02-11
  • 打赏
  • 举报
回复
一个数组就解决了。
逍遥jc 2014-02-11
  • 打赏
  • 举报
回复
数字小还行。数字一大根本停不下来~
破碎的泡泡 2014-01-06
  • 打赏
  • 举报
回复
这是 约瑟夫环 利用数学推理可以使算法简单很多
asdf1111sdf 2014-01-03
  • 打赏
  • 举报
回复
用链表实现了一下,但是那个编译器好像不支持链表
天空丶蒋 2014-01-01
  • 打赏
  • 举报
回复
引用 10 楼 angel_su 的回复:
google josephus problem或者百度一下...
谢谢了,我研究下.....
angel_su 2014-01-01
  • 打赏
  • 举报
回复
google josephus problem或者百度一下...
天空丶蒋 2014-01-01
  • 打赏
  • 举报
回复
引用 8 楼 angel_su 的回复:
模拟算法,类似暴力求解,百万数自然吃力,只问你最后一人,套约瑟夫问题的公式吧,一下子就得解... [quote=引用 7 楼 az6161311 的回复:] http://blog.csdn.net/az6161311/article/details/17737085 我也做了一个,不过貌似数值一大就不行了,什么原因啊 ?????????
[/quote] 这个套约瑟夫问题的公式是什么啊??没听过,也没学过,你有相关例子之类的吗???我下载下来看看...自学一下... 谢谢大大了。
angel_su 2014-01-01
  • 打赏
  • 举报
回复
模拟算法,类似暴力求解,百万数自然吃力,只问你最后一人,套约瑟夫问题的公式吧,一下子就得解...
引用 7 楼 az6161311 的回复:
http://blog.csdn.net/az6161311/article/details/17737085 我也做了一个,不过貌似数值一大就不行了,什么原因啊 ?????????
天空丶蒋 2014-01-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/az6161311/article/details/17737085 我也做了一个,不过貌似数值一大就不行了,什么原因啊 ?????????
SmallCoder1992 2013-12-28
  • 打赏
  • 举报
回复
这个类似的问题我也做过,只是做的时候我使用的是循环链表,不过个人觉得你可以使用循环队列试试,做这样的问题方法真的很多,仅供参考方法
angel_su 2013-12-28
  • 打赏
  • 举报
回复
如果只要知道最后一人,网搜索约瑟夫问题,有简单高效算法。上面模拟算法百万数顶不住...
看见繁华 2013-12-26
  • 打赏
  • 举报
回复
现做的,不容易阿 我,做了半个多小时。测试了一下 感觉还行。仅供参考阿。也望路过的大神批评 指教。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int n=0; int x,y,ko; puts("输入人的个数 n"); scanf("%d",&n); getchar(); int a[n]; int i,j,k; int *p; int cout; int sum1=0,sum2=0; p=a; for(i=0;i<n;i++) a[i] = 1; puts("输入x y"); scanf("%d %d",&x,&y); getchar(); i=0; cout = 0; k=0; while(1) { //正数 到第 x 个人 退出 for(i=k;;i++) { i=i%n; sum1+=a[i];//用于数到第x个人 if(sum1==x){ a[i] = 0; printf("第%d个人出圈\n",i); break; } } cout++; //判断数组中的每个元素的值是否都为0 if(cout==n) { ko=i; break; } //倒数 到第 y 个人 退出 for(j=(--i);;j--){ if(j<0) j = n+j;//消除负数影响 sum2+=a[j]; if(sum2==y){ a[j] = 0;//第j个人出圈,将值置为0 printf("第%d个人出圈\n",j); // printf("%d\n",j); break; } } cout++; if(cout==n){ ko = j; break; } k=j; sum1=sum2=0; } printf("最后出圈的事%d\n",ko+1); return 0; }
幸福式追求 2013-12-26
  • 打赏
  • 举报
回复
引用 1 楼 qdlgdx_lsy 的回复:
比较笨的方法,双向链表实现。
会超时的
赵4老师 2013-12-23
  • 打赏
  • 举报
回复
仅供参考
//假设有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();
}
qdlgdx_lsy 2013-12-22
  • 打赏
  • 举报
回复
比较笨的方法,双向链表实现。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧