题意:给定20个砝码,重量分别为3^i(i=0~19)。给定一个物品,质量为W(1 <= W <= (3^20-1)/2),放在天平左盘。左右皆可放砝码,如何放能使天平平衡。
思路:将物品的重量转化为三进制,如果某一位为0或者1则不需处理、为2便在此位加上相应的3的幂将2消除,并进位。最终得到的每位都为0或者1的数即为最终天平右端的重量。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 25
int n,T;
int num[N],res[N];
void print(int s[N],int len){
int i,flag = 0;
for(i = 0;i<=len;i++){
if(!flag && s[i]){
printf("%d",(int)pow(3,i));
flag = 1;
}
else if(s[i])
printf(",%d",(int)pow(3,i));
}
if(!flag)
printf("empty");
}
int main(){
scanf("%d",&T);
while(T--){
int i,len = 0;
memset(num, 0, sizeof(num));
memset(res,0, sizeof(res));
scanf("%d",&n);
while(n){ //将输入数字转化为3进制
num[len++] = n%3;
n /= 3;
}
for(i = 0;i<len;i++)
if(num[i] >= 2){//出现2(或3)
if(num[i] == 2)//此位为2表示在这位上加上一个相应的3的幂
res[i] = 1;
num[i] = 0;
num[i+1] ++;
}
print(res,len);
printf(" ");
print(num,len);//num数组恰为最终天平两端的重量
putchar('\n');
}
return 0;
}