http://poj.org/problem?id=1702
得到答案:左边放1和9,右边放3 和 27.
那么,怎样将标准的三进制转化成-1 0 1这三个数为系数的“三进制”呢?
从低位到高位的顺序开始:
1:如果当前位为2, 则当前位变为-1(减三), 高一位的系数+1。
//这个是符合的,因为高位的基数是低位的三倍,正好差三。
2:如果当前位是3,则当前位变为0(减三), 高一位的系数+1.道理同上。
3:其他不变。
题目描述:你有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
把负的部分移到等号左边:
得到答案:左边放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[1010];
int len,n;
__int64 t[21];
void judge(int x)
{
while(x / 3)
{
str[len++] = x % 3 + '0';
x /= 3;
}
str[len++] = x + '0';
}
int main()
{
__int64 temp = 1,i;
for(i = 0; i < 21; i++)
{
t[i] = temp;
temp *= 3;
}
scanf("%d", &n);
while(n--)
{
int x ;
len = 0;
scanf("%d", &x);
judge(x);
str[len++] = '0';
for(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( i = 0; i < len; i++)
if (str[i] == '0' - 1)
{
if (flag)
{
printf("%I64d", t[i]);
flag = false;
}
else
printf(",%I64d", t[i]);
}
if (flag)
printf("empty");
flag = true;
putchar(' ');
for( i = 0; i < len; i++)
if (str[i] == '1')
{
if (flag)
{
printf("%I64d", t[i]);
flag = false;
}
else
printf(",%I64d", t[i]);
}
putchar('\n');
}
return 0;
}