标题:N个人围城一圈报数,报到3退出的问题
只看楼主
yz912498286
Rank: 1
等 级:新手上路
帖 子:49
专家分:3
注 册:2015-8-24
结帖率:100%
已结贴  问题点数:20 回复次数:5 
N个人围城一圈报数,报到3退出的问题
N个人围城一圈报数,报到3退出的问题 ,如123 则最后剩下2, 第一个代码错误,第二个正确  第一个错在哪呀?

#include <stdio.h>
int main()
{int i,k,m,n,num[50],*p;
 printf("\ninput number of person: n=");
 scanf("%d",&n);
 p=num;
 for (i=0;i<n;i++)   //将输入的人排序
   *(p+i)=i+1;        
 i=0;                 
 k=1;                //k记录123报数
 m=0;               //m 退出的人数
 while (m<n-1)        
 {
if (*(p+i)!=0)    //当前数不是0,指向下一个数,且报数加1,是0的话,指向下一个数,但报数不变
     {
      i++;
      k++;
     }
     else i++;
     if (k==3)          //报3,指向下一个数,将k恢复成1   
     {
      *(p+i)=0;
      k=1;
      i++;
      m++;
     }
   if (i==n) i=0;               
   }
 while(*p==0) p++;
 printf("The last one is NO.%d\n",*p);
 return 0;
}


第二个
#include <stdio.h>
int main()
{int i,k,m,n,num[50],*p;
 printf("\ninput number of person: n=");
 scanf("%d",&n);
 p=num;
 for (i=0;i<n;i++)
   *(p+i)=i+1;        
 i=0;                 
 k=0;                  
 m=0;               
 while (m<n-1)        
  {if (*(p+i)!=0)  k++;
   if (k==3)                     
     {*(p+i)=0;
      k=0;
      m++;
     }
   i++;
   if (i==n) i=0;               
   }
 while(*p==0) p++;
 printf("The last one is NO.%d\n",*p);
 return 0;
}
搜索更多相关主题的帖子: include person number 围城 记录 
2015-09-08 15:50
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:5 
有一个中文的分号

能编个毛线衣吗?
2015-09-08 15:59
yz912498286
Rank: 1
等 级:新手上路
帖 子:49
专家分:3
注 册:2015-8-24
得分:0 
回复 楼主 yz912498286
把语法错误该过来后还有问题  两个逻辑好像有区别 第一个输出的是1  第二个输出的是2  不知道区别在哪
2015-09-08 16:01
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:10 
逻辑上的错误,1、k应该从0开始计数,2、无论如何i都要计数,i只需要一个总计数,不需要再分支中计数。代码1修改后代码如下:

程序代码:
#include <stdio.h>
int main()
{int i,k,m,n,num[50],*p;
printf("\ninput number of person: n=");
scanf("%d",&n);
p=num;
for (i=0;i<n;i++)   //将输入的人排序
   *(p+i)=i+1;        
i=0;                 
k=0;                //k记录123报数 
m=0;               //m 退出的人数
while (m<n-1)        
{ 
if (*(p+i)!=0)    //当前数不是0,指向下一个数,且报数加1,是0的话,指向下一个数,但报数不变
      k++;
     if (k==3)          //报3,指向下一个数,将k恢复成1   
     {
      *(p+i)=0;
      k=0;
      m++;
     }
     i++;
   if (i==n) i=0;
   }
while(*p==0) p++;
printf("The last one is NO.%d\n",*p);
return 0;
}

能编个毛线衣吗?
2015-09-08 16:55
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
得分:5 
这种题在论坛出现过很多次就是描述有些不一样

一片落叶掉进了回忆的流年。
2015-09-08 17:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
好复杂的代码,这怎么写怎么看呀
程序代码:
#include <stdio.h>

int main( void )
{
    unsigned n, ring[50], idx;
    if( scanf("%u",&n)!=1 || n>sizeof(ring)/sizeof(ring[0]) )
        return 1;

    for( idx=0; idx!=n; ++idx )
        ring[idx] = (idx+1)%n;
    for( idx=0; ring[idx]!=idx; idx=ring[ring[idx]] )
        ring[ring[idx]] = ring[ring[ring[idx]]];
    printf( "%u\n", idx+1 );

    return 0;
}

2015-09-09 08:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-457106-1-1.html




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

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