题目描述:你有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;