zoukankan      html  css  js  c++  java
  • 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;
    }
    (● ̄(エ) ̄●)
  • 相关阅读:
    log4j
    【表单验证】几个常用的正则表达式子
    【代码健壮性】善用data-属性来关联,慎用parent()之类的查找结构
    【javascript闭包】转载一篇不错的解释,也有几个大牛的链接
    【CSS】三栏布局的经典实现
    【转载】sublime text3 全攻略
    【CSS】text-align:justify 的使用
    javascript与jquery删除元素节点
    【Jquery对象】jquery与dom对象的区别
    【Jquery】this和event.target的区别
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/7417694.html
Copyright © 2011-2022 走看看