X-man

导航

POJ 1702 Eva's Balance (数论,平衡三进制)

题意:

       给你一个天平,和一些砝码,只是这些砝码有点特殊,它的重量是1,3,9,27,……3^n。让你把一些砝码和一个给定的重量的物体放在左边,另一些砝码放在右边,使天平平衡(每个砝码最多用一个),你会怎么做呢?这是一个很有趣的事,不是吗?这就是用平衡三进制解决最好的一个例子:

      比如我们假设这个物体的重量是20,那么我们可以这样做。首先我们把20(十进制)转化为三进制(202)(其实是砝码的三种状态,放左边,放右边,不放),然后我们按照一定的规则,把这些数转化成0,1,-1表示。规则就是:
      数的每一位只有三种状态,且,变换后是原来的值,只是三进制的表示方式改变了
      傻瓜式理解就是在三进制的数位上
      1.该为为2,改为-1,高一位加1(2=3-1的理解)
      2.该为为3,自然要进1,改为改为0;
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
    int N;
    int i,j,k,n,ni;
    int a[25];
    scanf("%d",&N);
    while(N--)
    {
        memset(a,0,sizeof(a));//数组初始化为0;
        scanf("%d",&n);
        ni=n;
        for(i=0;ni;i++)//转换为三进制
        {
            a[i]=ni%3;
            ni=(ni-a[i])/3;     
        }
        for(j=0;j<i;j++)//三进制内运算(数组各元素只能为-1,0,1)
        {
            if(a[j]==2)
            {
                a[j+1]++;
                a[j]=-1;
            }
            else if(a[j]==3)
            {
                a[j+1]++;
                a[j]=0;
            }
        }
        int flag1=0,flag2=0;//标记输出
        for(k=0;k<=i;k++)
        {
            if(a[k]==-1)
            {
                if(flag1)printf(",");
                flag1=1;
                printf("%.0lf",pow((double)3,(double)k));
            }

        }
        if(flag1==0)printf("empty");//左边无需加砝码,输出empty
        printf(" ");
        for(k=0;k<=i;k++)
        {

            if(a[k]==1)
            {
                if(flag2)printf(",");
                flag2=1;
                printf("%.0lf",pow((double)3,(double)k));
            }
        }
        printf("\n");
    }
    return 0;
}
注意:
1.数组初始化
2.pow((double)3,(double)k

posted on 2013-04-07 11:05  雨钝风轻  阅读(774)  评论(0编辑  收藏  举报