neuq 1105 坑爹的进制转换

题目描述:
以前我们做的进制转换大家都忽略了一点,就是进制一定是正整数;今天这道进制转换就坑爹的选择了,额,负整数来做进制。

输入:
输入由若干行组成,每行有两个整数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';

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值