| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 780 人关注过本帖, 1 人收藏
标题:[求助]N个人围成圈子 运行成功,但结果不对,大家看看。
只看楼主 加入收藏
JerryChen
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-8-14
收藏(1)
 问题点数:0 回复次数:6 
[求助]N个人围成圈子 运行成功,但结果不对,大家看看。

/*N个人围成圈子,从第一个人开始报数(从1到M号),凡是报到M的出圈,在从1开始,最后留下的是几号?*/
#include<stdio.h>
#include<ctype.h>
main()
{outcricle();

}
outcricle()
{ int n,m;
printf("\nplease input the number of peopel and outNo.\n");
scanf("%d%d",&n,&m);
printf("The last people is %d",f(n,m));
}
f(int a,int b)
{int k[20],i,j=1;
for(i=1;i<=a;i++)
k[i]=i;
for(i=1;i<=a;i++,j++)
{ if(j==b)
{for(;i<a;i++)
i=i+1;
a--;
j=1;
}
if(i==a)
i=1;
/* if(a==1)
{ return();
break;
} */
}
}


我最不明白的是,为什么有没有 if(a==1)
{ return();
break;
} ,/////大家可以试一下//////
都可以输出,并且输出的结果都一样呢?

搜索更多相关主题的帖子: 圈子 结果 运行 
2006-08-14 20:54
ridwsc
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2006-8-10
收藏
得分:0 

有N个人围成一圈,顺序编号.从第一个人起开始报数(从1到5),
凡数到5的人就从队伍中退出,编程实现最后队伍中留下的是第几号.


#include <iostream.h>

int main()
{
int *all, i, j;
int k=-1, l=0, m=1;

cout<< "请输入小孩的个数:";
cin>> j;
cout<< "给小孩编号分别为:";

if((all = new int[j]) != NULL)
{
for(i=0; i<j; i++)
{
cout<< i+1<< ",";
all[i] = i+1;
}

cout<< endl<< endl;
cout<< "每次被退出的小孩编号为:"<< endl;

while(1)
{
//数5个小孩
for(l=0; l<5;)
{
k = (k+1)%j;
if(all[k]!= -1)
l++;
}

if(m==j) break;

cout<< all[k]<< ",";

all[k] = -1;
m=m+1;
}

cout<< endl<< endl;
cout<< "最后胜出的小孩为:"<< endl;
cout<< all[k];
}

return 0;
}


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a[17],j;
int i, count, s;
printf("请输入人数:");
scanf("%d",&j);

printf("给每个人一个编号:\n");
for (i = 0;i < j;i++)
{
a[i] = i + 1; //填空数组,编号是下标加一,注意C语言中的数组下标从0开始
printf("%d,",a[i]);

}
printf("\n");
i=0;
s=j; //用来记录退出圈外的人的数目
count=0; //计数器
printf("\n每次被踢出的人的编号:\n");
while(s > 1)
{
for(i=0; i<j; i++)
if(a[i] != 0) //排除被踢了的数
{
count++; //报一次数
if(count == 5) //每报到一次3,该人退出
{
printf("%d\n",a[i]); // 把这个家伙打印出来
a[i] = 0;
count = 0; //计数器归零
s--;
}
}
}

for(i=0; i<j; i++)
if(a[i] != 0)
printf("\n最后一个是:%d\n",a[i]);

system("pause");
return 0;
}

[此贴子已经被作者于2006-8-15 9:15:59编辑过]


中国加油,加油,加油~~~~~ 我行~~我可以~~C
2006-08-15 09:14
ridwsc
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2006-8-10
收藏
得分:0 

你参考一下吧,不是本人的,嘿嘿


中国加油,加油,加油~~~~~ 我行~~我可以~~C
2006-08-15 09:16
lyn_gemini
Rank: 1
等 级:新手上路
帖 子:103
专家分:3
注 册:2004-9-15
收藏
得分:0 

在我的blog上也写过,[url]http://www.bc-cn.net/blog/user1/2260/archives/2006/1083.shtml[/url]

#i nclude <stdio.h>

#define COUNT 4 /*人的数目可在此更改*/

/*

功能:计算出最后剩余的人的编号,从0到count-1

参数:peopele[] : 存放人的数组

Count : 共有多少个人

Now : 当前数到了几,从0开始,不断往上增加

Left : 当前还剩下几人没’离开’,范围为1-count

返回:返回值为最后剩余的人的编号,从0到count-1

*/

int func(int people[], int count, int now, int left) {

if (left <= 1) {

/*如果只剩下一个人没走开,但now当前标识的元素可能值为0,故要寻找从

now开始的第一个值不为0的元素*/

for (;people[now%count]==0;now++);

/*返回该编号*/

return now%count;

}

else {

/*如果还剩下1人以上,则往下数三个值还不为0的元素*/

/*i用来标识是否数了三个*/

int i = 0;

for (;i<3;now++)

/*不论数到的元素值是否为0,now都要增加1,但i则需要元素值不为0才能增加1*/

people[now%count] == 0 ?i :i++ ;

/*将第三人设为0表示已走开*/

people[(now-1)%count] = 0;

/*还没’离开’的人数减1*/

left--;

/*开始新的递归*/

return func(people,count,now,left);

}

}

/*功能:调用递归函数func()*/

void main() {

/*初始化人的数组,编号从0开始,到count-1*/

int people[COUNT];

int i;

/*各元素初始值为1,表示都未离开*/

for (i=0; i<COUNT; i++)

people[i] = 1;

/*输出计算结果,因为编号从0开始,故输出时加1*/

printf ("%d\n",func(people,COUNT,1,COUNT)+1);

}


欢迎访问我的博客--*IT一粟*-- : http://lyn_gemini.
2006-08-15 16:32
ridwsc
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2006-8-10
收藏
得分:0 

-_-

[此贴子已经被作者于2006-8-15 16:42:22编辑过]


中国加油,加油,加油~~~~~ 我行~~我可以~~C
2006-08-15 16:39
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
收藏
得分:0 

比较不容易出错的方法是用循环单向链表或循环双向列表实现


个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2006-08-15 17:09
JerryChen
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-8-14
收藏
得分:0 

谢谢大家了,但我还关心的是,我最不明白的是,为什么有没有 if(a==1)
{ return(k[j]);
break;
} ,都一样呢?/////大家可以试一下//////

在我写的这个程序中,最终的结果是由其他地方返回的,到底是哪啊?

都可以输出,并且输出的结果都一样呢?

2006-08-15 20:50
快速回复:[求助]N个人围成圈子 运行成功,但结果不对,大家看看。
数据加载中...
 
   



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

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