您的位置:首页 > 其它

【洛谷 1017】进制转换

2016-11-08 17:42 197 查看
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
char nlist [20] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'} ; //字库
int main()
{
int n , r , i , temp = 15 , num [20] ;
bool flag = 0 ;
memset(num,0,sizeof(num));
cin >> n >> r ;
cout << n << '=' ;
r = abs ( r ) ;
if ( n == 0 ) { cout << "0(base-" << r << ")" ; return 0 ; }
if ( n < 0 ) { flag = 1 ; n = abs ( n ) ; } //如果是负数每个系数都取负,此处标记
for ( i = 0 ; i <= 15 ; i++ ) if ( pow ( r , i ) > n ) temp = i - 1 ; //记录n在abs(r)进制下的最高位指数
for ( i = 0 ; i <= temp ; i++ ) { num [i] = n % r ; n = n / r ; } //模n取余转换进制
for ( i = 1 ; i <= temp ; i+=2 ) num [i] = - num [i] ; //由abs(r)转换为r进制
if ( flag ) for ( i = 0 ; i <= temp ; i++ ) num [i] = - num [i] ;
for ( i = 0 ; i <= 19 ; i++ )
{
if ( num [i] == r ) { num [i] = 0 ; num [i+1] -- ; } //看下一条语句你就明白为什么要进位了。为什么是--?自行考虑
if ( num [i] < 0 ) { num [i] += r ; num [i+1] ++ ; } //将所有负的系数转正:正如减法当中的借位。为什么是++?自行考虑
}
for ( i = 19 ; i >= 0 ; i-- ) if ( num [i] != 0 ) { temp = i ; break ; }
for ( i = temp ; i >= 0 ; i-- ) cout << nlist [ num [i] ] ;
cout << "(base-" << r << ")" ;
return 0 ;
}


涉及到负进制的问题..

贴了份标程,不想写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  进制