[sicily]1298. 数制转换

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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值