十进制数转换成负进制数
这个题难点在于对于负数进制的理解,
我们知道这种进制转换可以用短除法,然后将余数倒序输出,这是对于模为正数而言,
那么,模为负数时,怎样处理呢?如果被除数和模都为负数,怎么处理呢?
对于模为负数的除法,不同语言的处理方式不同,
请问上面那种处理方式是正确的?
对于模负数的计算,可以简单地分为两种,
第一种,如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; }