c语言程序设计 题目一道,求解

现在有12只外表、颜色、大小均相同的小球,这12只球中有一个是坏球,但不知这个坏球是中还是轻,给出一天平,要求进行三次称重称出坏球,并知道其实轻还是重。编程实现上述过程。... 现在有12只外表、颜色、大小均相同的小球,这12只球中有一个是坏球,但不知这个坏球是中还是轻,给出一天平,要求进行三次称重称出坏球,并知道其实轻还是重。

编程实现上述过程。
我要程序啊。。c语言的,谢谢,只要程序即可
nousername@qq.com,贴出来也行,发我邮箱也行

注意:如果只是数学解题,100%不采纳,必须有程序,关键是C语言程序源码,谢谢!!!!!!!
展开
 我来答
沙咸英6U
2011-11-20 · TA获得超过993个赞
知道小有建树答主
回答量:529
采纳率:0%
帮助的人:410万
展开全部
恩,只写出思考过程,编码很简单。
把12只球分为这三组球分别编号为 A组、B组、C组。

首先,选任意的两组球放在天平上称。例如,我们把A、B两组放在天平上称。这就会出现两种情况:

第一种情况,天平两边平衡。那么,不合格的坏球必在c组之中。

其次,从c组中任意取出两个球 (例如C1、C2)来,分别放在左右两个盘上,称第二次。这时,又可能出现两种情况:

1·天平两边平衡。这样,坏球必在C3、C4中。这是因为,在12个乒乓球中,只有一个是不合格的坏球。只有C1、C2中有一个是坏球时,天平两边才不平衡。既然天平两边平衡了,可见,C1、C2都是合格的好球。

称第三次的时候,可以从C3、C4中任意取出一个球(例如C3), 同另一个合格的好球(例如C1)分别放在天平的两边,就可以推出结果。这时候可能有两种结果:如果天平两边平衡,那么,坏球必是C4;如果天平两边不平衡,那么,坏球必是C3。

2·天平两边不平衡。这样,坏球必在C1、C2中。这是因为,只有C1、C2中有一个是坏球时,天平两边才不能平衡。这是称第二次。

称第三次的时候,可以从C1、C2中任意取出一个球(例如C1), 同另外一个合格的好球(例如C3),分别放在天平的两边,就可以推出结果。道理同上。

以上是第一次称之后出现第一种情况的分析。

第二种情况,第一次称过后天平两边不平衡。这说明,c组肯定都是合格的好球,而不合格的坏球必在A组或B组之中。

我们假设:A组 (有A1、A2、A3、A4四球)重,B组(有B1、B2、B3、B4四球)轻。这时候,需要将重盘中的A1取出放在一旁,将A2、A3取出放在轻盘中,A4仍留在重盘中。同时,再将轻盘中的B1、 B4取出放在一旁,将B2取出放在重盘中,B3仍留在轻盘中,另取一个标准球C1也放在重盘中。经过这样的交换之后,每盘中各有三个球: 原来的重盘中,现在放的是A4、B2、C1,原来的轻盘中,现在放的是A2、A3、B3。

这时,可以称第二次了。这次称后可能出现的是三种情况:

1·天平两边平衡。这说明A4B2C1=A2A3B3,亦即说明,这六只是好球,这样,坏球必在盘外的A1或B1或B4之中。已知A盘重于B盘。所以,A1或是好球,或是重于好球;而B1、B4或是好球,或是轻于好球。

这时候,可以把B1、B4各放在天平的一端,称第三次。这时也可能出现三种情况:(一)如果天平两边平衡,可推知A1是不合格的坏球,这是因为12只球只有一只坏球,既然B1和B4重量相同,可见这两只球是好球,而A1为坏球;(二)B1比B4轻,则B1是坏球;(三) B4比B1轻,则B4是坏球,这是因为B1和B4或是好球,或是轻于好球,所以第三次称实则是在两个轻球中比一比哪一个更轻,更轻的必是坏 球。

2·放着A4、B2、C1的盘子(原来放A组)比放A2、A3、B3的盘子(原来放B组)重。在这种情况下,则坏球必在未经交换的A4或B3之中。这是因为已交换的B2、A2、A3个球并未影响轻重,可见这三只球都是好球。

以上说明A4或B3这其中有一个是坏球。这时候,只需要取A4或B3同标准球C1比较就行了。例如,取A4放在天平的一端,取C1放在天平的另一端。这时称第三次。如果天平两边平衡,那么B3是坏球; 如果天平不平,那么A4就是坏球 (这时A4重于C1)。

3.放A4、B2、C1的盘子(原来放A组)比放在A2、A3、B3的盘 子(原来放B组)轻。在这种情况下,坏球必在刚才交换过的A2、A3、B23球之中。这是因为,如果A2、A3、B2都是好球,那么坏球必在A4或B3之中,如果A4或B3是坏球,那么放A4、B2、C1的盘子一定 重于放A2、A3、B3的盘子,现在的情况恰好相反,所以,并不是A2、A3、B2都是好球。

以上说明A2、A3、B2中有一个是坏球。这时候,只需将A2同A3相比,称第三次,即推出哪一个是坏球。把A2和A3各放在天平的一端 称第三次,可能出现三种情况:(一)天平两边乎衡,这可推知B2是坏球;(二)A2重于A3,可推知A2是坏球;(三)A3重于A2,可推知A3是坏球。
追问
我要程序啊。。c语言的,谢谢
zero_fn
推荐于2017-09-11 · TA获得超过2258个赞
知道小有建树答主
回答量:1173
采纳率:80%
帮助的人:451万
展开全部
天平分左右:
1:分3份,任取两份称“第一次”(结果是一定可以找到有坏球的那一份)
2:天平左边放3个正常的球,右边在有问题的四个里面任取3个称“第二次”
2-1:如果平衡,说明问题球是剩余的一个,可以用“第三次”判断轻还是重(3-1)
2-2:如果不平衡说明问题球在刚取的那3个里,并且此时已经可以知道是重还是轻(因为左边是正常的球,右边低则问题球重,高则问题球轻)3-2
3-1:随便拿个正常的和问题球一比就知道轻重了
3-2:前提:2-2已经确定了3个有可能的问题球并且已经知道问题球的轻重了。
任取问题球里的两个放天平上
3-2-1 : 平衡 说明问题球是剩余的一个,并根据2-2知道轻还是重
3-2-2 : 不平衡,说明问题球两个中的一个,根据2-2已经知道问题球是轻还是重了。看天 平倾斜的方向就知道了那个是问题球了
追问
数学题我也会啊,关键是程序啊。。。。
追答
上面的回答不完整,判断不对,sorry
___程序已发你邮箱___
这个问题有意思,就做完给你了

理论上第3次称的时候有以下几种情况:
所有的分组通过前两次比较后将会得到一些信息,无论怎样比较,在最后一次天平称重前,必须要得到以下几个函数需要的信息(问题球数量,问题球的轻重)就可以解决问题了:

我的思维是分3组,任取两组,相等的话就是上面的回答;
不等的话就:

进入前提:
两组重量不等的4个球分别在天平两端(第一次称的结果)
并重新定义天平重的那一端为group1,轻的为group2 ,全正常的一组为group3

称量前准备:1将group1 中拿3个球出来,
2再group2中拿3个球放入group1中
3拿3个正常的球放入group2中
结果:3个从group1中拿出来的球,group1由原来的一个和group2中的3个组成新的group1,
group2中原来的一个和3个正常的组成新的group2。
天平左边是新的group1,右边是新的group2。
这个过程 叫左移;
为什么是3个球,因为这一步称完后可以知道问题球的轻重情况,

/*剩余三个嫌疑球,并已知问题球的轻重情况
任取两个比较,相等则第3个是问题球
不等,则根据已知的轻重来判断*/
int final_cmp_3_ball(int a,int b,int c,int L_H) // 三个球编号 a,b,c 是轻还是重
{
if(x[a] == x[b])
errno = c;
if(x[a] x[b])
{
if(LIGHTER == L_H)
errno = b;
else
errno = a;
}
errmode = L_H;
return 0;
}
/*剩余两个嫌疑球,仅知道两个球的关系 HEAVIER /LIGHTER*/
int final_cmp_2_ball(int a,int b,int normal,int cmp_a_b) // 两个球编号 a,b,normal任何一个正常球编号,mode_a_b 是指 a重于b或 a轻于b
{
if(x[normal] == x[a])
if(HEAVIER == cmp_a_b) {errno = b; errmode = LIGHTER;}
else {errno = b; errmode = HEAVIER;}
贴不下了
}
/*剩余一个嫌疑球,并不知道问题球和正常球的轻重关系
直接比较问题球和正常球*/
int final_cmp_1_ball(int a,int normal) // a 问题球 ,normal 正常球
{
..贴不下了
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
飞龙罗
2011-11-20
知道答主
回答量:38
采纳率:0%
帮助的人:16.5万
展开全部
坑爹啊 ,请问好、坏球的区别是什么?是好球重还是坏球重?
追问
这个就是题目要你求出来的啊。。。。。我了个天那!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
plt1999
2011-11-20 · TA获得超过189个赞
知道小有建树答主
回答量:411
采纳率:0%
帮助的人:143万
展开全部
你这问题有问题,不知道轻重的话三次不可能称出来
追问
我了个天那,那其他人都在做什么啊。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
JupterLB
2011-11-21 · 超过11用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:35.5万
展开全部
调试过了,都正确,只要知道了算法,根据算法一步一步来就是了。
#include <stdio.h>

int solve(int *p,int low,int high)
{
int a1=0,a2=0,i;
int middle=(low+high-1)/2;

for (i=low;i <= middle;i ++)
{
a1+=p[i];
}
for (;i <= high;i++)
{
a2+=p[i];
}
if (a1 == a2)
return 1;
else if (a1 > a2)
return -1;
else
return -2;
}

main()
{
int i,a[13]={0};

for (i=1;i < 13;i ++)
scanf("%d",&a[i]);

if ( solve(a,1,8) == 1)
{
if ( solve(a,6,11) == 1)
{
if (a[11] > a[12])
printf("the bad is 12:light");
else
printf("the bad is 12:weight");
}
else
{
if (solve(a,6,11) == -1)
{//light
if (a[9] == a[10])
printf("the bad is 11:light");
else if (a[9] > a[10])
printf("the bad is 10:light");
else
printf("the bad is 9:light");
}
else
{//weight
if (a[9] == a[10])
printf("the bad is 11:weight");
else if (a[9] > a[10])
printf("the bad is 9:weight");
else
printf("the bad is 10:weight");
}
}
}
else if (solve(a,1,8) == -1)
{//1-4 weight
if (a[1]+a[9]+a[10]+a[11] == a[2]+a[3]+a[4]+a[5])
{//6,7,8 bad ,light.
if (a[6] == a[7])
printf("the bad is 8:light");
else if (a[6] > a[7])
printf("the bad is 7:light");
else
printf("the bad is 6:light");
}
else if (a[1]+a[9]+a[10]+a[11] > a[2]+a[3]+a[4]+a[5])
{
if (a[1] == a[9])
printf("the bad is 5:light");
else
printf("the bad is 1:weight");
}
else
{
if (a[2] == a[3])
printf("the bad is 4:weight");
else if (a[2] > a[3])
printf("the bad is 2:weight");
else
printf("the bad is 3:weight");
}
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式