1298. 数制转换
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
有一种数制的基数是3,权值可以取-1,0,1,并分别用符号-,0,1表示,如这种数制的101表示十进制数的10,即1*(3^2)+0*(3^1)+1*(3^0)=10,又如这种数制的-0 表示十进制数的-3,即-1*(3^1)+0*(3^0)=-3。编程要求把给定的有符号整数转换为新数制的数,该数的前面不能有多余的0,如10的新数制表示是101,则不要输出成0101。
Input
文件有一行或多行,每行有一个整数N (-2,147,483,647≤N≤2,147,483,647),整数内不会有其他分隔符。
Output
对输入文件的每一行输出一行,该行是输入行的整数的新数制表示,不能有多余空行,每行之前不能有前导空格。
Sample Input
10
-3
Sample Output
101
-0
Z
这题有点意思,特殊的3进制转换,需要注意正负数。我们知道10进制转换成其他进制可以使用除商取余法,这里同样适用。留意到当n 为负数时,其余数是0,-1,-2;当n 为正数时,余数是0,1,2;所以,其实把负数可以转换成正数来做,只不过符号相反。比如,5,对应于3进制是 12, 而-5 对应的则是 -1-2;所以做个标记后就可以统一成正数来处理。但注意到本题中,余数有-1,0,1三个,没有2,所以要把余数为2的转换为 -1。如,5 = 1*3 + 2;这里应该改为 5 = 2*3 + (-1);从处理的角度来看,即遇到余数为2的时候,将其改成-1, 然后商加1。具体代码如下:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int tmp,index=0;
int a[100]={0};
int flag = 1;
if(n==0)
{
cout<<0<<endl;
continue;
}
if(n<0)
flag = -1;
tmp = n*flag; //做好标记
while(tmp>0)
{
a[index] = tmp%3; //数组a[] 保存余数
tmp = tmp/3;
if(a[index] == 2) //余数为 2,将其改为 -1并 商加回一个1.
{
a[index] = -1;
tmp++;
}
index++;
}
for(int i=index-1; i>=0; i--)
{
a[i] = a[i]*flag; // 负数跟正数的 1 和 -1 位置正好相反,因为我们保存的是正的余数,而负数的余数是负数。所以,为负数时,a[]==1即余数是-1,a[]==-1,即余数是 -2,根据转换规则转为 1才对。
if(a[i] == -1)
cout<<"-";
else
cout<<a[i];
}
cout<<endl;
}
// system("pause");
return 0;
}
Submit