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

 

posted @ 2016-11-08 20:49  一叶落尽天下秋  阅读(227)  评论(0编辑  收藏  举报