注册 登录
编程论坛 数据结构与算法

猴子大王,然我哭了无数遍

编程的未来 发布于 2013-03-31 23:29, 1207 次点击
现在改成这样,刚才的我已经完全没办法,不会搞了。。但是最后的结果很不对
#include<stdio.h>
 #include<malloc.h>
 #define MONKEY_NUMBER 50

 typedef int datatype;
 typedef struct node
 {
     datatype number;
     struct node *next;
 }Linklist;
 Linklist *head,*s,*t,*r;
 Linklist *p;

 int main()
 {
     void Sign_number(Linklist *,Linklist*,Linklist*);
     void Circulate_main(Linklist *,Linklist*,Linklist*);
     t = (Linklist*)malloc(sizeof(Linklist));
     head = t;
     s = (Linklist*)malloc(sizeof(Linklist));

     Sign_number(head,s,t);
     Circulate_main(head,s,t);
     return 0;
 }

 void Sign_number(Linklist *head,Linklist *s,Linklist *t)
 {
     int i,j,k;
     for(i = 0;i < MONKEY_NUMBER;i++)
     {
         s = (Linklist*)malloc(sizeof(Linklist));
         s->number = i + 1;
         t->next = s;
         t = s;

     }

     s->next = head->next;

     s = head->next;
     for(j = 0;j < 50;j++)
     {
         printf("%2d ",s->number);
         s = s->next;
     }

 }

 void Circulate_main(Linklist *head,Linklist *s,Linklist *t)
 {
     int i,j,k;
     s = head->next;
     while(s->next != s)
     {
         for(i = 0;i < 3;i++)
         {
             t = s;
             s = s->next;
            
            
         }
         t->next = s->next;
         printf("%2d",s->number);
         free(s);
         s = t->next;   
     }
     printf("%2d",s->number);
     getchar();
     getchar();
 }
13 回复
#2
azzbcc2013-03-31 23:58
每一条代码都要有他的作用,这些小作用加起来就实现了 函数的功能

写之前要想清楚自己要实现什么,具体如何实现, 由哪个变量实现。

心里清楚了每条代码的目的,没有改不对的程序。添加注释也是这个原因,因为我们记不到所有代码的目的。

每个变量都应有他自己的作用,不能先定义一大串,再挑着用。出现warning C4101 只能说明你写代码是思路不够清晰


最后说一点,学会调试。
#3
不玩虚的2013-04-01 12:48
哪有问题,是算法,还是编程。
#4
不玩虚的2013-04-01 12:51
有没有这么严重啊,原来是约瑟夫环问题啊,居然取了这么好听的一个名字
#5
编程的未来2013-04-01 13:07
回复 4楼 不玩虚的
........估计 是算法出错了
#6
不玩虚的2013-04-01 22:49
算了我帮你搞下吧,反正我上次准备帮人弄一直没时间就没有弄。
#7
azzbcc2013-04-01 23:23
以下是引用不玩虚的在2013-4-1 22:49:36的发言:

算了我帮你搞下吧,反正我上次准备帮人弄一直没时间就没有弄。

你应该看一下他上一个贴、、、
#8
yuccn2013-04-02 12:11
你为什么老是哭啊
#9
peach54602013-04-02 21:52
#10
Beann2013-04-02 22:09
程序代码:
#include <stdio.h>
int main()
{
    int T;
    int i, j;
    scanf("%d", &T);
    while(T --)
    {
        int x, y;
        int s = 0;
        scanf("%d %d", &x, &y);
        for(i = 2;i <= x;i++)
        {
            s = (s + y) % i;
        }
        printf("%d\n", s + 1);
    }
    return 0;
}
#11
peach54602013-04-03 11:18
以下是引用Beann在2013-4-2 22:09:18的发言:

#include <stdio.h>
int main()
{
    int T;
    int i, j;
    scanf("%d", &T);
    while(T --)
    {
        int x, y;
        int s = 0;
        scanf("%d %d", &x, &y);
        for(i = 2;i <= x;i++)
        {
            s = (s + y) % i;
        }
        printf("%d\n", s + 1);
    }
    return 0;
}


我表示,我没看懂,但这是个错误的,我知道
#12
Beann2013-04-03 12:34
回复 11楼 peach5460
额  没看懂 就是错误的  请指出来哪里错了
约瑟夫环有两种方法  一种是模拟  一种是递推 ,这一题猴子选大王 不需要模拟,只需要递推就可以了,而且递推的复杂度只是o(n).

[ 本帖最后由 Beann 于 2013-4-3 12:40 编辑 ]
#13
peach54602013-04-03 17:22
以下是引用Beann在2013-4-3 12:34:59的发言:

额  没看懂 就是错误的  请指出来哪里错了
约瑟夫环有两种方法  一种是模拟  一种是递推 ,这一题猴子选大王 不需要模拟,只需要递推就可以了,而且递推的复杂度只是o(n).


没看懂是没看懂你的内部逻辑
但是你while里面去输入...这个我觉得我不需要看懂,就知道你是错的吧?

好吧,我搜了一下那个什么环...找到你这段代码的出处了
我本来以为是错的,原来是对的呀
不过输出队列没输出来...

[ 本帖最后由 peach5460 于 2013-4-3 17:23 编辑 ]
#14
tamcyin2013-04-05 20:44
我个人编程学的很烂,前天看到你的猴子问题,我就莫名奇妙的写了一下。画了画图后感觉思路就清晰了,于是乎就写出来了。
1