A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© song0619 中级黑马   /  2015-12-22 19:19  /  3154 人查看  /  12 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
下面这道题是基础测试时做过的题,这是一类题,叫约瑟夫环,我用的是数组和循环实现了。但是这类问题应该用循环链表更方便些,不知道哪位能提供些循环链表方面的详细视频资料。谢谢啦!


**************************************************************************************************************
10、 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)



12 个回复

正序浏览
         * 约瑟夫环
         * * 幸运数字
         */
        public static void main(String[] args) {
                System.out.println(getLucklyNum(8));
        }

        /*
         * 获取幸运数字
         * 1,返回值类型int
         * 2,参数列表int num
         */
        public static int getLucklyNum(int num) {
                ArrayList<Integer> list = new ArrayList<>();                //创建集合存储1到num的对象
                for(int i = 1; i <= num; i++) {
                        list.add(i);                                                                        //将1到num存储在集合中
                }
               
                int count = 1;                                                                                //用来数数的,只要是3的倍数就杀人
                for(int i = 0; list.size() != 1; i++) {                                //只要集合中人数超过1,就要不断的杀
                        if(i == list.size()) {                                                        //如果i增长到集合最大的索引+1时
                                i = 0;                                                                                //重新归零
                        }
                       
                        if(count % 3 == 0) {                                                        //如果是3的倍数
                                list.remove(i--);                                                                //就杀人
                        }
                        count++;
                }
               
                return list.get(0);
        }
}
我吧老师的代码给你了 自己看吧  我也还要慢慢看才懂  一起进步吧
回复 使用道具 举报
#include "stdio.h" #include "stdlib.h" #define S sizeof(struct node)  struct node {     int num;     struct node *next; };  typedef struct node NODE;  NODE *createlinklist(int n) {     NODE *head,*p,*q;     int i=1;     head=p=(struct node*)malloc(sizeof(struct node));     p->num=i;     for(i=2;i<=n;i++)     {         q=(struct node*)malloc(sizeof(struct node));         if(q==0) return(0);         p->next=q;         p=q;         p->num=i;     }     p->next=head;          /*使链表尾指向链表头 形成循环链表*/  return head; }  void printlinklist(NODE *p,int n) {     int i;  NODE *q = p;     if(NULL == q->next){   printf("the list is NULL!");   return;  }     printf("所有玩家的信息列表:\n");     for(i=1;i<=n;i++)     {      if(NULL == q){    printf("the list is NULL!");    return;   }         printf("%d  ",p->num);         p=p->next;     }  printf("\n"); }  void joseph(NODE *p,int n,int m) {  int i,j;  NODE *q;  for(i=1;i<n;i++)  {   for(j=1;j<=m-1;j++)   {    p=p->next;   }   q=p->next;   p->next = q->next;   printf("%d  ",q->num);   free(q);  }  printf("\n最后剩余的是第%d号.\n",p->num);  p->next=NULL; }  void main() {     NODE *head;     int n,m;  printf("请输入人数N:\n");  scanf("%d",&n);  printf("输入K:\n");  scanf("%d",&m);     head=createlinklist(n);     printlinklist(head,n);  printf("依次被选出的是:\n");     joseph(head,n,m); }
回复 使用道具 举报
加油                     
回复 使用道具 举报
先顶了,因为还没有学到
回复 使用道具 举报
约瑟夫·~~~~~
回复 使用道具 举报
  1. // 循环链表,希望采纳
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. typedef struct node
  5. {
  6.         int data;
  7.         struct node *next;
  8. }node;

  9. node *create(int n)
  10. {
  11.         node *p = NULL, *head;
  12.         head = (node*)malloc(sizeof (node ));
  13.         p = head;
  14.         node *s;
  15.         int i = 1;

  16.         if( 0 != n )
  17.         {
  18.                 while( i <= n )
  19.                 {
  20.                         s = (node *)malloc(sizeof (node));
  21.                         s->data = i++;    // 为循环链表初始化,第一个结点为1,第二个结点为2。
  22.                         p->next = s;
  23.                         p = s;
  24.                 }
  25.                 s->next = head->next;
  26.         }

  27.         free(head);

  28.         return s->next ;
  29. }

  30. int main()
  31. {
  32.         int n = 41;
  33.         int m = 3;
  34.         int i;
  35.         node *p = create(n);
  36.         node *temp;

  37.         m %= n;   // m在这里是等于2

  38.         while (p != p->next )
  39.         {
  40.                 for (i = 1; i < m-1; i++)
  41.                 {
  42.                         p = p->next ;
  43.                 }

  44.                 printf("%d->", p->next->data );

  45.                 temp = p->next ;                                //删除第m个节点
  46.                 p->next = temp->next ;
  47.                 free(temp);

  48.                 p = p->next ;
  49.         }

  50.         printf("%d\n", p->data );

  51.         return 0;
  52. }
复制代码
回复 使用道具 举报
看好几个发的了,我就不用发了
回复 使用道具 举报
发给你了
#include<<a  target="_blank" class="baidu-highlight">stdio.h</a>>
#include <<a  target="_blank" class="baidu-highlight">stdlib.h</a>> 
//n表示最初有多少个人,m表示报数到多少的人离开,函数Joseph返回最后剩下的人的编号 
 
int Joseph(int n,int m) 
{  
    //int m=3;
    int count = n;   //count表示当前圈内剩下的人数 
    int num=0;     //num表示当前报的数 
    int i,j;       //i表示当前报数的人对应的下标 
    int *a, remain; 
    //动态申请连续的n个存储单元用来存放每个人的编号,将空间首地址赋值给a
    a = (int *)malloc(n*sizeof(int)); 
    for(i=0; i<n; i++) 
        a[i] = i+1; //a[i]保存第i个人的编号 
    i = 0; //从下标为0的人开始报数 
    //printf("Delete In Order: ");
    while(count>1) //如果剩余人数大于1则循环 
    { 
         
        num++; 
        if(num == m) //报数到m的人离开 
        { 
            //将下标为i的元素删除
            //printf("%d\t",a[i]);
            for(j=i; j<count-1; j++) 
                a[j] = a[j+1]; 
            count--; //当前剩余人数减1 
            num = 0; //下一个人重新从1开始报数 
            i-=1;          
        }
        i=(i+1)%count; //计算下一个要报数的人的下标 
    } 
    remain = a[0]; //最后只剩下一个人,将其编号赋值给remain
    return remain; 
}
 
int main()
{
    int n,m;
    int i;
    printf("input n and m:n表示最初有多少个人,m表示报数到多少的人离开\n");
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        //printf("%d\n",Joseph(n));
        printf("\nRemain: NO.%d\n",Joseph(n,m));
    }
    return 0;
}
回复 使用道具 举报
huaduwuzhe 来自手机 中级黑马 2015-12-26 08:51:10
板凳
怎么是用的C语言
回复 使用道具 举报
w261215 来自手机 中级黑马 2015-12-25 13:22:28
藤椅
来观摩一下
回复 使用道具 举报
Manli123 发表于 2015-12-22 23:11
#include  int main() {     int a[13];     for (int i = 0; i < 13; i++)         a = 1;     void fun(i ...

这个我已经解决了
回复 使用道具 举报
#include <stdio.h> int main() {     int a[13];     for (int i = 0; i < 13; i++)         a[i] = 1;     void fun(int *, int);     fun(a, 13);     return 0; } void fun(int *a, int size) {     int flag = 0,mun = size,*yuan=a;     while (mun > 1)     {         for (flag = 1; flag < 4; flag++)         {             if (a == yuan + size)                 a = yuan;             while (*a == 0)             {                 a++;                 if (a == yuan + size)                     a = yuan;             }             if (flag == 3)             {                 *a = 0;                  mun--;             }             a++;         }     }     a = yuan;     for (; a < yuan + size;a++)         if (*a != 0)         {         printf("是原来第%d号!\n", a - yuan + 1);         break;         } }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马