poj 1702 Eva's Balance(平衡三进制)

题目大意:给你一个天平,和一些砝码,只是这些砝码有点特殊,它的重量是1,3,9,27,……3^n。让你把一些砝码和一个给定的重量的物体放在左边,另一些砝码放在右边,使天平平衡(每个砝码最多用一个)

思路(平衡三进制):比如我们假设这个物体的重量是20,那么我们可以这样做。首先我们把20(十进制)转化为三进制(202),然后我们按照一定的规则,把这些数转化成0,1,-1表示。从低位到高位,我们这样来转化。当我们遇到一个2的时候,那么下一位加1,同时2变成-1。当我们遇到3的时候,那么下一位加1,同时3变成0,。然而当我们遇到1或0的时候我们不变也不进位。所以202就变成了1(-1)1(-1),这样20=(-1)*3^0+1*3^1+(-1)*3^2+1*3^3;这是一个很好的等式,所以我们把-1的项移到左边,剩下的在右边,就变成了20+1*3^0+1*3^2=1*3^1+1*3^3;这样放在天平的两端不就平衡了吗?20+1+9=3+27。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int a[100],i,n,T;

int qpow(int a,int b)
{
    int s=1;
    while(b>0)
    {
        if(b%2==1)
        {
            s=s*a;
        }
        a=a*a;
        b>>=1;
    }
    return s;
}

int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n;
        int ni=n;
        memset(a,0,sizeof(a));
        for(i=0;ni;i++)
        {
            a[i]=ni%3;
            ni=(ni-a[i])/3;
        }
        for(int j=0;j<i;j++)
        {
            if(a[j]==3)//我们遇到3的时候,那么下一位加1,同时3变成0
            {
                a[j]==0;
                a[j+1]++;
            }
            if(a[j]==2)//当我们遇到一个2的时候,那么下一位加1,同时2变成-1
            {
                a[j+1]++;
                a[j]=-1;
            }
        }
        int flag1=0,flag2=0;
        for(int j=0;j<=i;j++)
        {
            if(a[j]==-1)
            {
                if(flag1) printf(",");
                flag1=1;
                cout<<qpow(3,j);
            }
        }
        if(flag1==0) cout<<"empty";
        cout<<" ";
        for(int j=0;j<=i;j++)
        {
            if(a[j]==1)
            {
                if(flag2) printf(",");
                flag2=1;
                cout<<qpow(3,j);
            }
        }
        cout<<endl;
    }

    return 0;
}

 二进制和三进制的妙用:https://blog.csdn.net/qq_30339595/article/details/79410369

原文地址:https://www.cnblogs.com/Fy1999/p/8995293.html