Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2340759
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:09:04


1.问题描述:
幼儿园有n(<20)个孩子围成一圈分糖果,老师先随机地发给每个孩子若干颗糖果,然后按以下规则调整:每个孩子同时将自己手中的糖果分一半给坐在他右边的小朋友;如共有8个孩子,则第1个将原来的一半分给第2个,第2个将原有的一半分给第3个……第8个将原来的一半分给第1个,这样的平分动作同时进行;若平分前,某个孩子手中的糖果是奇数颗,则必须从老师那里要一颗,使他的糖果变成偶数。小孩人数和每个小孩的初始数由键盘输入。经过多少次调整,使每个孩子手中的糖果一样多,调整结束时每个孩子有糖果多少颗,在调整过程中老师又新增发了多少颗糖果。
2.解决方案:
应用数组通过判断数组元素是否相等来表示小孩手中的糖果是否相等。利用循环结构,当小孩手中的糖果不等时应进行调整循环,在调整循环过程中,需要处理三个问题:第一是当小孩手中的糖果是奇数时,应使其成为偶数并统计新增发的糖果数;第二是将小孩手中糖果数的一半加给下一个小孩;第三是将每个小孩的一半糖果仍保留在自己手中。
四、主要技术问题的描述
依据三的描述,可以构造一个函数int  allequall(int a[],int n)判断各小孩手中的糖果是否相等。
请问为什么我的程序运行不了,是哪 里出了问题呀?请大家帮帮我,谢谢了。


#include
int allequall(int child[],int n)
{
int i,x;
for(i=0;i {
if(child[i]!=child[i+1]){x=1;
return x;
break;
}
else
x=0;
return x;
}
}
void main()
{
const int N=20;
int i,n,m,j,a;
int child[N];
static int s,b=0,c=0;
cout<<"please input the number of children:"< cin>>n;
cout<<"please input the number of candy:"< for(i=0;i cin>>child[i];
cout< for(i=0;i {
cout< if(child[i]%2!=0){
++child[i];
++b;
}
}cout<<"b="< cout< do
{
for(i=0;i<100;i++)
{
for(i=0;i child[i]=child[i]/2;
for(i=1;i child[i]=child[i+1]+child[i];
child[0]=child[n-1]+child[0];
a=allequall(child,n);
if(a==1)
break;
for(i=0;i if(child[i]%2){
++child[i];
++c;
}
}
}while(1);
s=b+c;
for(i=0;i cout< cout< cout<<"the increase of candy is:"< cout<}



--------------------next---------------------
1、allequall()函数中的for循环,应为i< n-1 (数组序号是从0开始的),如果使用i< n,将无法跳出for循环;

2、do-while循环中的第二个for语句中:
   child[i]=child[i+1]+child[i];
   child[0]=child[n-1]+child[0];
   如果按照上面语句执行,假设三个小孩(n=3),各持有1,2,3颗糖果,经之前语句的处理后,child[0]、child[1]、child[2]分别等于1、1、2,则:
   child[1]=child[2]+child[1]=1+1
   child[2]=child[?]+child[2]=?+1  //仍然是数组的问题,序数从0开始计
但若更改为child[i]=child[i-1]+child[i],则:
   child[1]=child[0]+child[1]=1+1=2
   child[2]=child[1]+child[2]=2+1=3
   child[0]=child[2]+child[0]=3+1=4
这与题意不符,题目要求多人传递的同时性,而以上的代码实际上表达的是一轮只进行两人间的一次传递,其结果影响到整圈传递的结果果(这决不等价于整圈同时进行的传递分步进行),以此进行最终进入死循环,无法达到平衡,应该设置一个新的暂存数组变量,且我们可以理解为child[i]为第i位此轮保留的糖果,而暂存数组表示将要拿出去的糖果(尽管其实它们的值是一样的,都是原持有数的一半);

3、a=allequall(child,n);
   if(a==1)
   break;
allequall()函数是判断是否达到了平均,返回1时表示仍不平均,在此if语句的条件似乎应该为a==0

以上三点是我认为实质性的错误。
另外,do_while循环中的for(i=0;i<100;i++){},我不明白是什么意思,好象没用吧?
还有,设置b的作用是不是要输出每一轮的增加糖果数呢?我是这样理解的,所以改了一下;
更改后的代码如下:


#include

int allequall(int child[],int n)
{
    int i,x;
    for(i=0;i {
        if(child[i]!=child[i+1]){x=1; break;}
        else {x=0;}
}
return x;
}

void main()
{
const int N=20;
int i,n,m,j,a;
int child[N];
int linshi[N];//暂存数组,表示传出的糖果(不好意思,英文不好,忘了“暂时”怎么拼)
int b=0,c=0;
cout<<"please input the number of children:"< cin>>n;
cout<<"please input the number of candy:"< for(i=0;i cin>>child[i];
cout<
do
{
for(i=0;i {
cout< if(child[i]%2!=0
{
++child[i];
++b;//每轮增加的糖果数
++c;//总的增加的糖果数
}
linshi[i]=child[i]/2;
}
cout<<"b="< b=0;
cout<
for(i=1;i {
child[i]=linshi[i-1]+child[i]/2;
}
child[0]=linshi[n-1]+child[0]/2;
a=allequall(child,n);
if(a==0)
{break;}
}while(1);

for(i=0;i {
cout< }
cout< cout<<"the increase of candy is:"< cout<}

我编译了一下,应该没问题,还有两个warning:
 warning C4101: 'j' : unreferenced local variable
 warning C4101: 'm' : unreferenced local variable
做不了这么仔细了,有高手看到的话指教一下。
我也刚学C++几个月,有不对的地方别客气啊。:P



--------------------next---------------------
#include
bool allequall(int child[],int n)//判断各小孩手中的糖果是否相等
{
for(int i=0;iif(child[i]!=child[i+1])
return false;//不相等返回假
return true;//相等返回真
}
const int MaxNum=20;//定义最大人数
//主函数
void main()
{
loop:
cout<<"Pelase input the number of the children:";
int Num;
cin>>Num;//输入人数
if(Num>MaxNum)
{
cout<<"Error Number!!"<goto loop;
}
int *child;
int *child1;
//构造两个相应大小的数组child代表小朋友现有的糖果数child1代表小朋友原来有的糖果数
int Tnum=0;
child=new int [Num];
child1=new int [Num];
for(int i=0;i{
cout<<"Input NO."<cin>>child[i];
}
while(!allequall(child,Num))//当糖果数不相等时循环
{
for(int d=0;d{
if(child[d]%2!=0)
{
child[d]++;
Tnum++;
}
}//把糖果数为奇数小朋友的糖果数+1
for(int c=0;cchild1[c]=child[c];//将child1赋值用来记忆原来小朋友的糖果数
for(int r=0;rchild1[r]/=2;//求出原来每个小朋友糖果数的一半
for(int a=0;a{
child[a]/=2;
child[a]+=child1[a+1];
}
child[Num-1]/=2;
child[Num-1]+=child1[0];//把最后一个小朋友糖果数的一半加第一个小朋友的糖果数
}
cout<<"每个同学最后分到糖果数目是:"<<<"老师分发出的糖果数是:"<}



--------------------next---------------------

阅读(1433) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~