| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 626 人关注过本帖
标题:[求助]为什么这个程序的第二个while没有运行?
只看楼主 加入收藏
rejorcelife
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-3-26
收藏
 问题点数:0 回复次数:7 
[求助]为什么这个程序的第二个while没有运行?

/*题目:有n(n<100)个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出*/
#include "stdio.h"
count(int x)
{int i=0,j,k,m;
int a[100];
for(i=0;i<99;i++)
a[i]=0;
m=x;
while(m>=3)
{j=0;
for(i=0;i<x;i++)
if(a[i]==0)
{j++;
k=i+1;
if(j/3==1)
{a[i]=1;
m--;
j=0;
printf("the kicked man is the %dth\n",i+1);
}
}
}
getch():
while(i<x&&a[i]==0)
{printf("the left people is the %dth\n",i+1);
getch();
i++;
}
}
main()
{
int n;
printf("the total people is:");
scanf("%d",&n);
count(n);
}

基本思想:首先将给数组所有元素赋值0,在循环的过程中,如果被踢出去,则赋值1,最后判断剩下元素值为0的数则是所要求答案。
问题1:以输入10为例,the kicked man输出正确3、6、9、4、8、5、7、10;第二个while好像没有运行;
问题2:如果n没有限定,又如何写这个程序?

搜索更多相关主题的帖子: 运行 
2006-04-22 09:51
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 
程序我没细看,感觉写得乱了.还有结果不对,最后应该只剩下1个人,怎么可以剩2个(因为是围成一圈).请把程序写上注释并把格式写好.还有,你定义了a[100]这样内存空间损失了也太大了,最好需要输入几个数组就定义几个元素.

我的原则很简单:不做不喜欢的事!
2006-04-22 11:15
rejorcelife
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-3-26
收藏
得分:0 

count(int x)
{int i=0,j,k,m;
int a[50];
for(i=0;i<49;i++)/*将数组中所有值赋0*/
a[i]=0;
m=x;
j=0;
while(m!=1)
{for(i=0;i<x;i++)
if(a[i]==0)
{j++;
if(j/3==1)/*被踢出去的赋值1*/
{a[i]=1;
m--; /*同时m数减1表示剩下的未被踢的*/
j=0; /*再重新数3*/
printf("the kicked man is the %dth\n",i+1);
}
}
}
getch();
for(i=0;i<x;i++)
if(i<x&&a[i]==0)/*用以判断最后未被踢的是第几个*/
{printf("the left people is the %dth\n",i+1);
getch();
}
}
main()
{
int n;
printf("the total people is:");
scanf("%d",&n);
count(n);
}

2楼的:"最后应该只剩下1个人,怎么可以剩2个(因为是围成一圈)",一语惊醒梦中人,这是修改后的,这个就可以了,原来的判断语句while(i<x&&a[i]==0)本身就是个错误,结果还越陷越深,基本功不够扎实的缘故,还是要感谢你!


一直在努力!
2006-04-22 12:41
rejorcelife
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-3-26
收藏
得分:0 
问题2:如果n没有限定,又如何写这个程序?
这个问题还没解决,继续求教!

一直在努力!
2006-04-22 12:42
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
得分:0 
#define MAX 100
#include<iostream.h>
void main()
{
static int a[MAX+1];
int n,i=1,k=0,m=0;
cout<<"Please input numbers of monkey: ";
cin>>n;
while(m<n-1)
{
if(a[i]==0)
{ k++;
if(k%3==0)
a[i]=1,m++;
}
i++;
if(i==n+1)
i=1;
}
for(i=1;i<=n;i++)
if(a[i]==0) break;
cout<<"The monkey king is: "<<i<<"th."<<endl;
}

潜水员!
2006-04-22 13:02
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 
不客气.
问题2:如果没限制,我想就用指针来做吧(因为数据大了指针的效率就明显高了许多).用动态内存分配,要几个人就分配相应多少空间.

我的原则很简单:不做不喜欢的事!
2006-04-22 13:08
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
int count(int n)
{
int *memo=NULL;
int i,j,left,counter=0;
memo=(int *)malloc(n*sizeof(int));
for (i=0;i<n;i++)
*(memo+i)=0;
left=n;
for(i=0;left>1;i++)
{
if(*(memo+i%n)==0)
counter++;
if(!(counter%3)&&*(memo+i%n)==0)
{
*(memo+i%n)=1;
left--;
}
}
for(i=0;i<n;i++)
if(*(memo+i)==0)
j=i+1;
free(memo);
printf("the left num is %d",j);
}
main()
{
int num;
printf("Please input a number:");
scanf("%d",&num);
count(num);
getch();
}
程序比较小就没写注释了,用动态空间申请可实现。

对不礼貌的女生收钱......
2006-04-22 15:05
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用soft_wind在2006-4-22 15:05:00的发言:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
int count(int n)
{
int *memo=NULL;
int i,j,left,counter=0;
memo=(int *)malloc(n*sizeof(int));
if(memo==NULL) /*加上这几句.健壮些*/
{
printf("No enough memory!Press any key to exit.");
getch();
exit(0);
}

for (i=0;i<n;i++)
*(memo+i)=0;
left=n;
for(i=0;left>1;i++)
{
if(*(memo+i%n)==0)
counter++;
if(!(counter%3)&&*(memo+i%n)==0)
{
*(memo+i%n)=1;
left--;
}
}
for(i=0;i<n;i++)
if(*(memo+i)==0)
j=i+1;
free(memo);
printf("the left num is %d",j);
}
main()
{
int num;
printf("Please input a number:");
scanf("%d",&num);
count(num);
getch();
}
程序比较小就没写注释了,用动态空间申请可实现。


对不礼貌的女生收钱......
2006-04-22 15:10
快速回复:[求助]为什么这个程序的第二个while没有运行?
数据加载中...
 
   



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

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