• 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;
    }
    (● ̄(エ) ̄●)
  • 相关阅读:
    03Qt信号与槽(2)
    01Qt中的隐式共享
    10GNU C语言函数调用
    09GNU C语言程序编译
    第一本C语言笔记(下)
    07控制器和控制卡(3)
    06控制器和控制卡(2)
    集合
    linux指令(目录类操作指令)
    面向对象三大特征
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/7417694.html
Copyright © 2020-2023  润新知