题目大意:将一个数表示为大于这个数的三进制数,每位的数字只能是1或者是0,输出这个三进制数和表示为这样一个三进制数后这个数超出的部分(10进制)。
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
数据规模:1<=n<=10^7。
理论基础:进制数的权值:n进制数第i位的权值为n^(i-1)。从低位数起。
题目分析:我们以样例为例子:5表示为三进制后为:12,但是它个位数为2所以需要加1,变为20,此时最高位又变成了2此时我们又要加上3,这时数变成了100满足要求。那么输出结果就是:9 4(9-5)。
从分析中我们可以看出,我们从n表示成三进制以后的最低位开始,如果此位为第i位且为2,那么给n+此位的权值,x相当于给当前位+1,而超过的数:tip=tip+此位权值。直至检测到n的最高位。也就是n==0;
value=1;t=n;
while(n)
{
if(n%3==2)
{
n=n+1;
tip=tip+value;
}
value=value*3;
n=n/3;
}
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
unsigned int tip=0,bill=0,n,m=1;
int main()
{
scanf("%u",&n);
bill=n;
do
{
if (n%3 == 2)
{
tip+=m;
++n;
}
n/=3,m*=3;
}while (n);
if(!tip)tip=m;
printf("%u %u\n",bill+tip,tip);
return 0;
}
其中应该注意的地方是,如果n恰好能表示成一个不含有2的三位数,此时n与bill相等不符合要求,所以我们只好给它再加一个最高位,那么tip就等于当前的权值了。
by:Jsun_moon http://blog.csdn.net/Jsun_moon