我知道一个题的解题思路可是不知道怎么用c表示

dai1016 2001-12-05 08:24:41
有13个球﹐只有1个球的重量与其它12个球不同(但并不知轻重)﹐有1个天平﹐但没有砝码﹐请你用天平称3次﹐将这个重量不同的球找出来,并得出球是重是轻。用c的代码编写出来。
对球编号1到13。
第一次称。1,2,3,4放左边,5,6,7,8放右边。有三种情况:
1. 平衡:说明9到13有坏球。第二次取9,10,11放左,1,2,3放右。分析三种可能:
a:平衡:说明坏球在12,13之中。
b:左重:说明坏球在9,10,11之间。且坏球较重。第三次将9,10称,若平,11坏球,否则重
的为坏球。
c:右重:与左重类似,但轻的是坏球。
2. 左重:说明1到8号有坏球。9到13为好球。
第二次称:把4号与5号对调,再将6,7,8,与9,10,11对调。然后称,又有三种可能:
a:平衡:说明坏球在6,7,8之间。且坏球较轻。第三次将6,7称,若平,8坏球,否则轻的为

坏球。
b:左重:说明坏球在1,2,3之间。且坏球较重。第三次将1,2称,若平,3坏球,否则重的为

坏球。
c:右重:说明坏球是4或5。拿出一个与好球比较。
3. 右重: 类似于左重方法处理。
...全文
105 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dai1016 2001-12-12
  • 打赏
  • 举报
回复
huahao0672(华好0672) 谢谢你
huahao0672 2001-12-11
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

float sum(int i,int j,float a[]);
int find(float m,float n,int end,int st1,int st2);

main()
{float a[14],m,n,weight_rand;
int i,st1=1,st2=7,step=6,find_rand,end=13,keep_rand;
randomize();
for(i=1;i<14;i++) a[i]=5;
keep=random(13)+1;
/*通过随机产生编号数和该编号数的重量,做到真正的随机,而非人为指定*/
weight_rand=5.0+(pow(-1,(random(10)+1))*(random(10)+1)/10));
a[keep_rand]=weight_rand; /*下面的目的是要找这个随机数是多少*/
printf("\n\n-------------------------------\n");
for(i=0;i<3;i++)
{ m=sum(st1,st1+step,a);n=sum(st2,st2+step,a);
printf(" m=%3.2f,n=%3.2f,st1=%d,st2=%d,end=%d;\n",m,n,st1,st2,end);
if(m!=n&&step=6) end=12;
if(m==n) {find_rand=end;break;}
elseif(step!=1)
if(m!=5*step) {step=step/2;st2=st1+step;end=(st1+end)/2;}
else {step=step/2;st1=st2;st2=st2+step;}
else fidn_rand=find(m,n,end,st1,st2);
}
printf("--------------------------------------\n");
/*通过保存产生的编号和该球的重量来检察程序是否正确*/
printf("keep_rand=%d,weight_rand=%3.2f",keep_rand,weight_rand);
printf("the randomize number is :%d",find_rand);
if(a[find_rand]>5) printf("random weight > 5 :%3.2f\n",a[find_rand]);
else printf("random weight < 5 :%3.2f\n",a[find_rand]);
}

float sum(int i,int j,int a[])
{float s=0.0;int m;
for(m=i;m<j;m++)
s=s+a[m];
retturn s;
}

int find(float m,float n,int end,int st1,int st2)
{ if(m==n) return end;
else if(m!=5) return st1;
else return st2;
}

以上程序在turbo c 2.0 测试通过。

球的轻重是可以判断的,但是重量是不可以求的。在以上的程序中通过随机产生一个正负
值来比较的。
pow(x,y)的功能是求X的Y次方。

huahao0672 2001-12-06
  • 打赏
  • 举报
回复
上以程序有一些问题,下面公布的程序是完全正确的。在turbo c 2.0上测试通过。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{int a[14],i,m,n,st1=1,st2=7,step=6,find_rand,end=13;
int keep_rand;
randomize();
for(i=1;i<14;i++)
a[i]=5;
keep=random(13)+1;
a[keep_rand]=4; /*下面的目的是要找这个随机数是多少*/
for(i=0;i<3;i++)
{ m=sum(st1,st1+step,a);n=sum(st2,st2+step,a);
if(m==n) {find_rand=end;break;}
else
{if(step!=1)
{step=step/2;
if(m>n) {st1=st2;st2=step+st2;}
else
{st2=st1+step;
if(end%2!=0) end=(end+st1)/2-1;
else end=(end+st1)/2;
}
else
{if(m==n) find_rand=end;
else if(m>n) find_rand=st2;
else find_rand=st1;
break;
}
}
}
printf("keep_rand=%d,",keep_rand);
printf("the randomize number is :%d",find_rand);
}
int sum(int i,int j,int a[])
{int s=0,m,n;
for(m=i;m<j;m++)
s=s+a[i];
retturn s;
}

以上程序中没有求球的重量,不过要求也不是很难。
对可以这样,在for循环语句中可以设定两个函数一个判断大的,一个判断小的。

wsztk 2001-12-06
  • 打赏
  • 举报
回复
第三次用12和1比 就可以找出12 13哪个是坏球
不过不能判轻重
jps 2001-12-06
  • 打赏
  • 举报
回复
你的方法好像不能求出坏球的轻重

第一次 1,2,3,4放左边,5,6,7,8放右边,平衡说明9到13有坏球。
第二次 取9,10,11放左,1,2,3放右,平衡:说明坏球在12,13之中。
第三次 怎么把12,13中的坏球找出并判断轻重?
huahao0672 2001-12-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{int a[13],i,j,m,n,st1=0,st2=6,step=5,find_rand,end=12;
randomize();end=12;
for(i=0;i<13;i++)
a[i]=5;
a[random(13)]=4; /*下面的目的是要找这个随机数是多少*/
for(i=0;i<3;i++)
{m=sum(st1,st1+step,a);n=sum(st2,st2+step,a);
if(m==n) {find_rand=end;break;}
else
{if(m>n)
{step=step/2;
st1=st2;st2=step+st2;
}
else
{step=step/2;end=end/2-1;
st2=st1+step;
}
}
}
printf("the randomize number is :%d",find_rand);
}
int sum(int i,int j,int a[])
{int s=0,m,n;
for(m=i;m<=j;m++)
s=s+a[i];
retturn s;
}

我对楼上人的看法有点不同,我觉得重量是次要的,可以人为指定,关键是球的编号要随机生成。我们要找的也就是这个随机生成的编号。
以上程序是我即兴写的没有上机运行,dai1016你可以自已运行一下。
如果要检查程序是否正确只要保存一下随机变量就可以知道这个程序是否正确了。

wangzhong 2001-12-05
  • 打赏
  • 举报
回复
用数组来表示球,重量可以用随机生成,而那个特殊球的位置也用随机数来决定即可
dai1016 2001-12-05
  • 打赏
  • 举报
回复
华好0672,谢谢你,不过重量是必要的,必须求出坏球的重量

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧