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