加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 1702 模拟 三进制

(2010-03-31 08:58:00)
标签:

杂谈

分类: 杂题

    题目描述:你有1, 3, 9。。。一直到3的19次方,有这20个重量的砝码,现在给你一个天平和一个标有重量物体,物体一开始放在天平的左边,让你用这20个砝码中的几个放在天平上,使左右平衡,输出天平左边和右边的详细砝码信息。(已知问题有解)

    此题可以转化为3进制的问题,例如物品重为20, 20 = 202(3进制) = 2 * 3^2 2 * 3^0 = 2 * 9 2

    可以写成 20  = 1 -1 1 -1 = 1 * 3^3 - 1 * 3^2 1 * 3^1 - 1 * 3^0 = 27 - 9 3 - 1

    把负的部分移到等号左边:

    20 9  1 = 27 3

    得到答案:左边放1和9,右边放3 和 27.

    那么,怎样将标准的三进制转化成-1 0 1这三个数为系数的“三进制”呢?

    从低位到高位的顺序开始:

    1:如果当前位为2,则当前位变为-1(减三), 高一位的系数 1。

    //这个是符合的,因为高位的基数是低位的三倍,正好差三。

    2:如果当前位是3,则当前位变为0(减三),高一位的系数 1.道理同上。

    3:其他不变。

    代码:

#include<iostream>
#include<string>
using namespace std;
char str[1000];
int len;
void judge(int x)
{
    while(x / 3)
    {
        str[len ] = x % 3 '0';
        x /= 3;
    }
    str[len ] = x '0';
}
__int64 xx[20];
void out()
{
    for(int i = len - 1; i >= 0; i--)
        putchar(str[i]);
    cout << endl;
}
int main()
{
    int n;
    __int64 temp = 1;
    for(int i = 0; i < 20; i )
        xx[i] = temp, temp *= 3;
    scanf("%d", &n);
    while(n--)
    {
        int x;
        len = 0;
        scanf("%d", &x);
        judge(x);
        str[len ] = '0';
        for(int i = 0; i < len; i )
            if (str[i] == '2')
            {
                str[i] = '0' - 1;
                str[i 1] ;
            }
            else if (str[i] == '3')
            {
                str[i] = '0';
                str[i 1] ;
            }
        bool flag = true;
        for(int i = 0; i < len; i )
            if (str[i] == '0' - 1)
            {
                if (flag)
                    printf("%I64d", xx[i]), flag = false;
                else
                    printf(",%I64d", xx[i]);
            }
        if (flag)
            cout << "empty";
        flag = true;
        putchar(' ');
        for(int i = 0; i < len; i )
            if (str[i] == '1')
            {
                if (flag)
                    printf("%I64d", xx[i]), flag = false;
                else
                    printf(",%I64d", xx[i]);
            }
        putchar('\n');
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有