题目描述:
以前我们做的进制转换大家都忽略了一点,就是进制一定是正整数;今天这道进制转换就坑爹的选择了,额,负整数来做进制。
输入:
输入由若干行组成,每行有两个整数n(-32765<=n<=32767)和R(-16<=R<=-2)。输入的最后一行只有一个‘#’号,表示输入结束。
输出:
对于每个输入行,输出n的R进制形式。出现的字母请用大写字母表示!
样例输入
30000 -2
-20000 -2
28800 -16
-25000 -16
#
样例输出
11011010101110000
1111011000100000
19180
7FB8
分析:对于负进制的转化和正进制规范基本相同,但是考虑到进制转化过程中的余数应该始终为整数,所以对于计算机中除以负数结果商或者余数为负的情况要格外处理。
验算得到,如果计算结果余数为负数,那么应该将负数加上进制的绝对值,商加1,这样就保证了进制转化后的数位都是正整数或者0.
注意到余数大于等于10之后用A、B、C…等字母表示。
注意到字符串结尾要以 ‘\0’结尾。
既可以用转置函数处理最后的字符串,也可以直接倒置输出。
main函数返回值一定是0!否则显示运行过程出错
#include"stdio.h"
#include"string.h"
#include"math.h"
void function(int n,int R);
//void reverse( char *s);
int R;
int n;
char a[10024];
int main()
{
int i;
while(scanf("%d%d",&n,&R))
{
//memset(a,0,sizeof(a)) ;
function(n,R);
for(i = strlen(a)-1; i>=0; i--)
{
printf("%c",a[i]);
}
//reverse(a);
//puts(a);
printf("\n");
}
return 0;
}
/*void reverse( char *s)
{
int len = strlen(s);
for(int i = 0,j = len-1; i < j; i++, j--){
char temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}*/
void function(int n,int R)
{
int yushu;
int i = 0;
if(n == 0)
a[i++] = '0';
while(n != 0)
{
yushu = n%R;
n = n/R;
if(yushu >= 0)
{
a[i] = yushu;
}
else
{
a[i] = yushu +abs(R);
n++;
}
if(a[i] >= 10)
{
a[i] = (a[i] - 10) +'A';
}
else
{
a[i] = a[i] +'0';
}
i++;
}
a[i] = '\0';
}