p1633[进制应用]砝码称重

描述 Description 

一个天平,砝码分别为1g、3g、9g、27g、…6561g,每个砝码只有一个,要称重的物品放在天平的左侧,而砝码允许放在天平的左右两侧。已知一个物品的重量,问如何称重?试编程解决


输入格式 Input Format
一个重量N(1≤N≤9000)


输出格式 Output Format
将所使用的砝码重量,按从大到小的顺序输出。其中与物品异侧的砝码用正号表示,与物品同侧的砝码用负号表示。(第一个砝码前的正号要省略)


样例输入 Sample Input
15


样例输出 Sample Output
27-9-3


时间限制 Time Limitation
1s


注释 Hint
三进制的典型应用


来源 Source
经典题目

 

      神知道为啥我刚刚打过一遍的博客神秘bug导致我还得再打一遍........

      思路:刚刚拿到这个题的时候不明白为什么要用三进制,后来问了问机房的dalao(澜神),仔细想了想突然明白是为啥了

      因为三进制这一位的前一位一定高这一位3倍,又因为所有砝码都只有一个且是从1开始后面每一个都是前一个的3倍,因为

      三进制为1,0,2,这三个数,由题意可知我们每个砝码只有1个,所以就将2换位-1,并前一位++,以此类推,知道这个数组里

      面就只有0,-1,1,这三个数。如果a[i]==0那么就continue,如果为1则+1,为-1则减一。(切记第一个数上是没有+号的

      

      代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<sstream>
using namespace std;
int a[100000];
int main()
{
    int n;
    cin>>n;
    memset(a,0,sizeof(a));
    int len=0;
    while(n>0)
    {
        a[len++]=n%3;
        n/=3;
    }
    for(int i=0;i<len;i++)
    {
        if(a[i]>1)
        {
            a[i]-=3;
            a[i+1]++;
        }
    }
    if(a[len]!=0)
        len++;
    string s="";
    int h=1;
    for(int i=1;i<len;i++)
    {
        h*=3;
    }
    for(int i=len-1;i>=0;i--)
    {
        if(a[i]==0)
        {
            h/=3;
            continue;
        }
        if(a[i]==-1)
        {
            stringstream ss;
            ss<<h;
            string s1=ss.str();
            s+='-';
            s+=s1;
            h/=3;
        }
        if(a[i]==1)
        {
            stringstream ss;
            ss<<h;
            string s1=ss.str();
            if(i!=len-1)
                s+='+';
            s+=s1;
            h/=3;
        }    
    }
    cout<<s<<endl;
    return 0;
}
(● ̄(エ) ̄●)

 

posted @ 2017-08-23 13:20  列車員lcy  阅读(407)  评论(0编辑  收藏  举报