codevs 2866 天平系统2
题目描述 Description
一个天平,砝码分别为1g、3g、9g、27g、...、6561g,每个砝码只有一个,要称重的物品放在天平的左侧,而砝码允许放在天平的左右两侧。已知一个物品的重量,问如何称重?试编程解决。
输入描述 Input Description
一个重量N
输出描述 Output Description
所使用的砝码重量,按从大到小的顺序输出。其中与物品异侧的砝码用正号表示,与物品同侧的砝码用负号表示。(第一个砝码前的正号要省略)
样例输入 Sample Input
15
样例输出 Sample Output
27-9-3
数据范围及提示 Data Size & Hint
(1≤N≤10000)
思路:
将n处理成3进制的形式,然后如果第i位是2,则第i位变为-1,i+1位+1;
如果第i位是3,则第i位变成0,i+1位+1。
代码:
#include<cstdio> using namespace std; int a[10],n,b[100001],tot; void zh(int x) { while(x) { tot++; b[tot]=x%3; x/=3; } } int main() { int i,j; a[1]=1; for(i=2;i<=9;i++) a[i]=3*a[i-1]; scanf("%d",&n); zh(n); for(i=1;i<=tot;i++) if(b[i]==2) b[i]=-1,b[i+1]++; else if(b[i]==3) b[i]=0,b[i+1]++; while(b[tot]!=0) tot++; tot--; printf("%d",a[tot]*b[tot]); for(i=tot-1;i>=1;i--) { if(b[i]>0) printf("+"); if(b[i]!=0) printf("%d",a[i]*b[i]); } return 0; }