| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3666 人关注过本帖, 1 人收藏
标题:求助,关于丢手帕问题
只看楼主 加入收藏
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3452
专家分:19340
注 册:2012-3-31
收藏
得分:0 
xie

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-11-06 12:04
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
鄙视11楼,回复十楼,原题目是这样的:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到4报数),凡报到4的人退出
    圈子,问最后留下的是原来第几号的那位。
最后剩下的那个人之出去9个以后剩下的那个
1 2 3(4去掉继续)5 6 7(8去掉继续) 9 10 1(2去掉继续)3 5 6(7去掉继续)9 10 1(3去掉继续)5 6 9(10去掉继续)1 5 6(9去掉继续)1 5 6(1去掉继续)5 6 5(6去掉)最后剩5 即是所要的数
      

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-06 12:27
小旭哥
Rank: 2
等 级:论坛游民
帖 子:106
专家分:72
注 册:2012-11-4
收藏
得分:5 
回复 楼主 yaobao
这就是所谓的约瑟夫问题  把数字存放在一个数组里, 选择一个起始点   然后每次删除一个人的时候  将后面的元素向前移动  然后数组长度减一   这问题用数据结构比较好
2012-11-06 12:52
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:15 
你错误只有一点,就是忽略了连续几个0 的情况
当*k=0时,k++,若此时*k还是0呢
程序代码:
#include<stdio.h>
main()
{
    int a[10]; /*定义一个有十个元素的数组,存放编号*/
    int i,j,*k,p=1,t=0,m=1; /*i,j用于循环,k为指向数组元素的指针,p用来记录指针移动次数*/
    for(i=0;i<10;i++)       /*t用来记录已经退出的个数,m累计10次后指针回归数组首元素*/
        a[i]=i+1;               /*为数组循环赋值1~10*/


    k=a;           /*指针指向首元素*/
    for(j=1;j<1000;j++)
    {
        if((m-1)%10==0)k=a;  /*m累计10次后指针回指*/
        while(*k==0){k++;m++;} /*若指针指向的元素值为0,指针下移,m累计加1*/
        if(p%4==0)
        {         /*指针有效移动(所指向元素不为0)后,将指针所致元素赋值为0,t累计加1*/
            *k=0;
            t++;
            if(t==9)   /*t累计为9(即已经有9个元素被赋值为0)后,跳出循环*/
                break;
        }
   
        k++; /*无论以上if语句是否成立,每次循环,k、m、p均累计加1*/
        m++;
        p++;
        while(*k==0){k++;m++;}/*判断两次*/
    }
    for(i=0;i<10;i++)
    {                  /*循环输出数组中值不为0的元素*/
        if(a[i]!=0)
            printf("%d\t",a[i]);
    }
    return 0;
}




[fly]存在即是合理[/fly]
2012-11-06 16:39
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
向 azzbcc 同学致敬
不是思路的问题,不是写法的问题,是欠缺缜密的思维,困扰我两天的问题原来是因为思维不够严密,
活该被憋疯啊
忏悔啊。。。。。。。。。。。。。。。。。。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-06 17:00
chentaoszu
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-8-2
收藏
得分:0 
  不知道你学过数据结构吗   用单向循环链表我认为是比较好解的
2012-11-06 17:56
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
链表学过,但单向循环链表没有

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-06 19:22
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
费了九牛二虎之力,总算弄出来了,真不易啊,困扰我3天了,弄得我便秘都,拿出来晒晒,安慰下这3天受伤的内心:
程序代码:
#include<stdio.h>
void main()
{
    void sefu(int m,int n);
    int m,n,i;
    for(i=0;i<1000;i++)
    {
        printf("Please input the number of the total:");
        scanf("%d",&m);
        printf("please input a number:");
        scanf("%d",&n);
        if(m>n&&m<1000)break;
        else
        {
            printf("error!re-input please!");
            m=0;
            n=0;
        }
     }
    sefu(m,n);
    getch();
}
void sefu(int m,int n)
{
    int a[1000];
    int i,j,k=0,w=1,q=0,*p;
    for(i=0;i<m;i++)
    a[i]=i+1;
    p=a;
    for(i=0;i<10*m;i++)
    {
        if(*p==0)
        {
        do
        {
            p++;
            k++;
            if(k==m){p=a;k=0;}
        }
        while(*p==0);
        }
        if(w==n)
        {
            *p=0;w=0;q++;
        }
        p++;
        w++;
        k++;
        if(k==m){p=a;k=0;}
        if(q==m-1)break;
    }
    for(j=0;j<m;j++)
    if(a[j]!=0)printf("the number is: %d\n",a[j]);
}
一通百通,浑身轻松

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-07 11:19
jk_love
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:196
专家分:965
注 册:2012-10-22
收藏
得分:0 
回复 18楼 yaobao
用链表弄了下:
#include <stdio.h>
typedef struct node{
    int flag;
    int index;
    struct node *next;
    } node;
   
void nodeinit(node **L,int m)
{
    node *head,*tmp,*r;
    int i;
    (*L)=(node *)malloc(sizeof(node));
    if(!L)
        {            
        printf("malloc failed\n");
        return ;
      }
      (*L)->flag=0;
      (*L)->index=1;
      r=*L;
     for(i=2;i<=m;i++)
     {
         tmp=(node *)malloc(sizeof(node));
         if(!tmp)
             {
                 printf("malloc faiedl\n");
                 return;
                 }
         tmp->flag=0;
         tmp->index=i;
         r->next=tmp;   
         r=tmp;
         }
         r->next=*L;
    }   
void   getresult(node *L,int m,int n)
{
    int count=1;
    node *tmp;
    tmp=L;
    while(tmp->next != NULL)
    {
        if(n==count)
        {
          tmp->flag=1;
          count=0;        
          m--;
          if(m==0)
              break;
         }
     tmp=tmp->next;         
         if(tmp->flag==0)
             {
                 count++;
                 }
        }
  printf("---get result is index=:%d\n",tmp->index);
    }        
void main(int argc,char* argv[])
{
    if(argc<3)
        {
        printf("usage: test NUM1,NUM2\n");   
        return;
    }
    node *L;
    nodeinit(&L,atoi(argv[1]));
    getresult(L,atoi(argv[1]),atoi(argv[2]));
  free(L);
    }   
2012-11-07 12:02
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
感谢楼上,继续研究,顶

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-07 12:36
快速回复:求助,关于丢手帕问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059010 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved