题目描述
以前我们做的进制转换大家都忽略了一点,就是进制一定是正整数;今天这道进制转换就坑爹的选择了,额,负整数来做进制。
输入
输入由若干行组成,每行有两个整数n(-32765<=n<=32767)和R(-16<=R<=-2)。输入的最后一行只有一个‘#’号,表示输入结束。
输出
对于每个输入行,输出n的R进制形式。出现的字母请用大写字母表示!
样例输入
30000 -2
-20000 -2
28800 -16
-25000 -16
#
-20000 -2
28800 -16
-25000 -16
#
样例输出
11011010101110000
1111011000100000
19180
7FB8
1111011000100000
19180
7FB8
分析: 会遇到余数为负数的情况 讲它变成正的 余数-r(r<0) 商(n)+1 , 这样应该是最简单的算法
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include <iostream>
#include <deque>using namespace std;
int main()
{
int n,r;
while(cin>>n&&cin>>r&&!cin.fail())
{
deque<char> sx;
int yu,x;
char ch;
if(n==0)sx.push_front(48);
while(n!=0)
{
yu=n%r;
x=n/r;
if(yu<0) {yu-=r;x++;} //余数为负数 减r(r<0) 商(n)+1
ch=(yu<10)?(yu+48):(yu+55); //int和char的转换 0-9 +48 10以上转为字母 +55
sx.push_front(ch);
n=x;
}
for(deque<char>::iterator it=sx.begin();it!=sx.end();it++)
cout<<*it;
cout<<endl;
}
return 0;
}