十进制数转换成负进制数

洛谷P1017

 

这个题难点在于对于负数进制的理解,

我们知道这种进制转换可以用短除法,然后将余数倒序输出,这是对于模为正数而言,

那么,模为负数时,怎样处理呢?如果被除数和模都为负数,怎么处理呢?

对于模为负数的除法,不同语言的处理方式不同,

 

 

请问上面那种处理方式是正确的?

对于模负数的计算,可以简单地分为两种,

第一种,如1和3,被除数和余数符号相同,这样计算的语言有C、C++、JAVA

第二种,如2和4,被除数和余数符号相反,这样计算的语言有python

两者的分歧是由于对取整的定义不同,分为去掉小数和向下取整两类,

以熟悉的 正数/正数 取整为例,

如果结果带小数,那么去掉小数即可,正数的向下取整和去掉小数是一样的,

但负数是不同的,负数去掉小数相当于向上取整,这时去掉小数和向下取整的区别就出现了,结果相差1,

而相应的余数也就不同了,具体的可以参考https://www.zhihu.com/question/31344913

 

这道题我用C语言做的,所以取整按照去掉小数的做法,

题目中规定除数是负数,而被除数在短除的过程中会出现正数,

就有正数/负数、负数/负数两种情况,

题目中每一位要求为非负数,也就是余数为非负数,

当正数/负数时,正常取余就行,

当负数/负数时,余数需要变成正数,也就是将3变成4,那么就是商+1,余数-模,

 

当余数>=10时,需要中字母表示数字,具体的转换方式见代码,

 

之后,只要按照正常的短除法来做就行了

 

#include <stdio.h>

void NumConvert(long long num, long long radix)
{
    if (num == 0)
        return;
    else if(num > 0)
    {
        NumConvert(num / radix, radix);
        if (num % radix >= 0 && num % radix < 10)
            printf("%lld", num % radix);
        else
            printf("%c", (char)(num % radix + 55));//num % radix + 55是对应的大写字母ASCII码
    }
    else
    {
        if (num % radix == 0)
        {
            NumConvert(num / radix, radix);
            printf("%lld", num % radix);
        }
        else if (num % radix - radix > 0 && num % radix - radix < 10)
        {
            NumConvert(num / radix + 1, radix);
            printf("%lld", num % radix - radix);
        }
        else
        {
            NumConvert(num / radix + 1, radix);
            printf("%c", (char)(num % radix - radix + 55));
        }
    }
}
int main()
{
    long long num = 0, radix = 0;
    scanf("%lld", &num);
    scanf("%lld", &radix);
    printf("%lld=", num);
    NumConvert(num, radix);
    printf("(base%lld)", radix);
    return 0;
}

 

posted @ 2020-07-10 17:23  _lyl  阅读(1177)  评论(0编辑  收藏  举报