• 十进制数转换成负进制数


    洛谷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;
    }
  • 相关阅读:
    Linux磁盘分区MBR分区
    win10 1809磁盘占用总是100%
    LINUX系统的7种运行级别
    【工作环境】公司主域控硬盘损坏后的维修步骤
    程序员的一些人生感悟
    dispatch_get_main_queue 的同步异步问题
    虚拟机VirtualBox中Ubuntu无法全屏解决方法
    十大报错、报异常、跑不起来原因
    关于scrollbarfacecolor只支持ie的解决方法
    一个严肃的面试经验
  • 原文地址:https://www.cnblogs.com/lylhome/p/13280319.html
Copyright © 2020-2023  润新知