poj 1702 模拟(用三进制砝码测量物体质量)

题意:给定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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值