| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1340 人关注过本帖
标题:只想看看思路,不需要代码,题分析的有点乱了
只看楼主 加入收藏
白茶清欢
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2018-12-2
结帖率:57.14%
收藏
已结贴  问题点数:4 回复次数:3 
只想看看思路,不需要代码,题分析的有点乱了
题目描述

ACM公司生产金币的设备出了问题,使得最近生产的10批金币的重量出现了波动:本来金币的标准重量是10克,但现在有的可能是11克,有的可能9克,也有可能是10克。
现在只知道同一批金币的重量是相同的,你的任务是要把每批的单枚金币的重量找出来。
你的设备有一个电子秤,但只允许称量一次!
你从第1批中取1枚金币,第2批取3枚,...第i批取3^(i−1)枚...,第10批取3^9枚,总共29524枚。将这29524枚金币放在电子秤上,得到了总重量,就交给你的程序去!


输入

有多个测试序列,每个测试序列一行,包含一个6位的正整数W(265716≤W≤324764),表示29524枚金币的总重量


输出

每个测试序列输出一行,包含10个用空格分开的正整数,分别表示10批金币的单枚重量,注意行尾没有空格。


样例输入

265716
324764
295240

样例输出

9 9 9 9 9 9 9 9 9 9
11 11 11 11 11 11 11 11 11 11
10 10 10 10 10 10 10 10 10 10
搜索更多相关主题的帖子: 思路 代码 金币 测试 输出 
2019-01-29 22:25
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:2 
是一个排列组合的问题:
重量有3个值 9,10,11
有10批金币分别抽出,1,3,9,27,。。。。。,pow(3,9)如果忽略数值,那么可以把10批金币看成10个盒子。
往10个盒子里面放9,10,11三个数值直到他们乘积之和为称出来的重量,那么盒子里的数值就是一批金币单个金币的重量。
 
这里用10个for语句.

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2019-01-29 23:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:2 
程序代码:
#include <stdio.h>

// a*3^0 + b*3^1 + c*3^2 + …… = W - 29524*9 (其中 0 <= a、b、c、…… <= 2)
// 也就是将 W-29524*9 换成三进制表示

int main( void )
{
    for( unsigned w; scanf("%u",&w)==1; )
    {
        for(unsigned base=19683; base!=0; base/=3 )
            printf( "%u%c", (w-29524*9)/base%3+9, " \n"[base==1] );
    }
}
2019-01-30 10:27
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
回复 3楼 rjsp
厉害!!!以下是我详细解读
#include <stdio.h>

// a*3^0 + b*3^1 + c*3^2 + …… = W - 29524*9 (其中 0 <= a、b、c、…… <= 2)
解读:重量是三个值9,10,11可以写成(0+9,1+9,2+9),而0,1,2是三进制的数,根据数的运算规律,a,b,c,...j只取(0,1,2)其中一个,而9有3^0+3^1+...+3^9个共29524,W是总重量,所以得出
 a*3^0 + b*3^1 + c*3^2 + ……+j*3^9+29524*9=W    =>    a*3^0 + b*3^1 + c*3^2 + …… = W - 29524*9

// 也就是将 W-29524*9 换成三进制表示

int main( void )
{
    for( unsigned w; scanf("%u",&w)==1; )
    {
        for(unsigned base=19683; base!=0; base/=3 )
解读:这是一个十进制转换成三进制的运算,base值初始为19683,这个是最三进制串的最高位,base/=3,base就是紧邻最高位的次高位
            printf( "%u%c", (w-29524*9)/base%3+9, " \n"[base==1] );
    }
}

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2019-01-30 17:24
快速回复:只想看看思路,不需要代码,题分析的有点乱了
数据加载中...
 
   



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

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