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; }