| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8544 人关注过本帖, 3 人收藏
标题:称量1-100g的重量,最少需要几种砝码?求高手编写c程序
只看楼主 加入收藏
yang511623
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2012-6-11
收藏
得分:1 
来学习了
2012-07-04 12:10
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:1 
我记得可以用数学归纳法证明用3^0,3^1,....3^n-1这n个砝码通过加减法组出0-(3^n-1)/2的任意一个数,所以答案应该是[log3(n)]+1
2012-07-04 12:26
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用czz5242199在2012-7-4 12:26:04的发言:

我记得可以用数学归纳法证明用3^0,3^1,....3^n-1这n个砝码通过加减法组出0-(3^n-1)/2的任意一个数,所以答案应该是[log3(n)]+1


以下是引用随风飘荡在2012-7-4 01:31:36的发言:

为什么是二进制,两种状态,放和不放?
但是不是也可以放左和放右么


秒啊~
2012-07-04 14:05
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这个问题确实又是一个三进制的问题。记得以前我探讨过一个称坏乒乓球的问题,和这个问题有异曲同工之处。

小曹的思路是对的,但答案[log3(n)]+1是不对的。

下面我简单分析一下这个问题。

这个问题其实包含三个子问题:

1.称量需要多少个砝码。

2.每个砝码的质量是多少。

3.称量某一重物,达到平衡状态时,每个砝码如何摆放。


先讨论第1个问题。

不管是天平还是普通杆秤,砝码的放置位置都有三个,一是不放在秤上,二是放在秤上与被称物不在一起,三是放在秤上与被称物在一起。楼主的“标准答案”并没有考虑第三种情况。

我们还是以天平作为衡器来描述问题吧。

我们可以设被称量物总是放在左边的,这样天平的左右盘的意义就不同了。

每个砝码在称量中可以有三种状态。放在左边、不放上天平、放在右边。

那么N个砝码最多可以组合出3^N种状态。这3^N种状态除了全不放上天平外其它状态都有一个对称的状态。

假设有某一状态是左边放了Sa砝码,右边放了Sb砝码(Sa,Sb都是砝码集S的子集,并且Sa、Sb不相交),那么必然会有另一状态(左边放Sb右边放Sa)与之对应。

设左边砝码总重量为Wa,右边为Wb,则这一平衡状态下的被称物重量为Wb - Wa。

与它对称的状态在平衡时被称物重量为Wa - Wb。

很显然,这一对状态下被称物重量必然有一个为负值。负重量在现实中不存在。

所以N个砝码能表示的正状态为(3^N - 1)/2种。也就是能表示的最大的被称物质量。

由此,称量重量为W的重物时需要的砝码数是 N = log3(2 * W + 1)。这是小曹说错的地方。


接下来讨论第2个问题。

有了上面的讨论其实这第2个问题的结论已经出来了。状态呈现三进制计数的性质,所以每个砝码3的幂次,这样即可保证状态无重叠且连续。

从小到大,第i个砝码的质量应该是 3^(i - 1)。


最后讨论第3个问题。

将状态表示成三进制数,每一位对应一个砝码(质量为该位的基)的取值为0、1、2。现在我们建立三进制数与被称量物重量的对应关系。

我们规定0表示该位对应砝码放在左边,1表示不放在天平上,2表示放在右边。

这么规定是有意义的。

我们希望用三进制数的变化情况与被称物质量的变化对应。也就是说被称物质量越大这个三进制数的值也越大。

在这种规定下三进制0的意义是什么?

是所有砝码都放在左边,即与被称量物放在一起。这时如果要天平平衡,那被称量物具有的将是负质量。

而天平上什么都不放的状态(零质量)对应的数值是...1111111。即每位都是1。

所以这里只是应用了部分的三进制计数性质,而非正常意义下的三进制数。

这里的0表示的其实是负无穷,而无限多的1表示的是十进制数0。它其实是将整个整数域映射到了非负整数域。

而我们使用的是有限位三进制数,且最高位为2(略去更高位的无限个1)。

这个概念比较抽象,如果理解不了可以跳过。

由于每位为1表示零质量,而我们用N个砝码。所以我们计算的基准值应为(N^3 - 1) / 2。

对于重量为W的重物,它对应的三进制数值为。

(3^N - 1) / 2 + W

这个三进制值的每一位的值将表示该位对应砝码的放置位置。


结尾,送一段代码来输出上面理论的计算结果,供大家验证。

程序代码:
#include<stdio.h>
#include<math.h>

int f(int w)
{
    return ceil(log(w * 2 + 1) / log(3));
}

void print_weight(int w)
{
    int n, a;
    const char * B[] = {"L", "O", "R"};
    n = f(w);
    for(a = (int)(pow(3, n) - 1) / 2 + w; a; a /= 3)
        printf("%5s ", B[a % 3]);
}

int main()
{
    int w, n, i, t;
    printf("Input weight : ");
    scanf("%d", &w);
    n = f(w);
    printf("It needs %d weights.\n", n);
    printf("Every weights is:\n");
    for(i = 0, t = 1; i < n; i++, t *= 3) printf("%5d ", t);
    puts("");
    print_weight(w);
    return 0;
}



重剑无锋,大巧不工
2012-07-04 20:39
zhengyaoniu
Rank: 1
等 级:新手上路
帖 子:2
专家分:1
注 册:2012-7-4
收藏
得分:1 
回复 14楼 beyondyf
太牛了,你把这个问题写清楚了!
2012-07-04 23:04
玉面狂龙
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:82
专家分:156
注 册:2012-2-23
收藏
得分:1 
2012-07-04 23:56
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
连集都不会啊,最近卡住了,beyond大大以前还指导过我呢。这段存下来慢慢看。
要恶补数学啊数学啊数学啊
2012-07-05 00:17
沉默的复仇者
Rank: 2
等 级:论坛游民
帖 子:33
专家分:15
注 册:2012-7-5
收藏
得分:1 
不懂

Every thing is possible.
2012-07-05 09:08
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
编程的目的是为了解决问题。而语言不过是这个过程中用到的工具。

我们必须学会工具的使用,但会用工具并不等于能解决问题。

所以建议各位在学习语言的过程中不要乎视了问题解决能力的培养。

重剑无锋,大巧不工
2012-07-05 11:34
handle09
Rank: 1
等 级:新手上路
帖 子:7
专家分:1
注 册:2012-5-15
收藏
得分:1 
还在细细品味中
2012-07-05 17:44
快速回复:称量1-100g的重量,最少需要几种砝码?求高手编写c程序
数据加载中...
 
   



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

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