我的代码编译成功了,但是每次运行参数./base.o 42 2
(将其转换为二进制的基2
)时,输出都是0
,每次运行./base.o 99 5
时,结果都是444
重复。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[]) {
int remainder = 0;
int num0 = 0;
int i = 0;
int num1 = atoi(argv[1]);
int num2 = atoi(argv[2]);
int quotient = num1;
while (quotient != 0) {
remainder = num1 % num2;
quotient = quotient / num2;
num0 = (remainder * pow(10, i)) + num0;
i++;
}
printf("%d\n", num0);
return 0;
}
3条答案
按热度按时间lvmkulzt1#
数制只是供人类阅读的,数字是一种书写基数幂次递增多项式的简写形式。
例如,以
10
为底数(==基数)的数字3057
为:3
×103 +0
×102 +5
×101 +7
×100我可以完全改变基数:
B
×162 +F
×161 +1
×160我们看到
B
(11)×16×16加上F
(15)×16再加上1等于2816+240+1 = 3057 --这和前面的数字完全一样。文本到整数
从文本表示转换为数值非常简单:
所谓“c的值”,就是说
'7'
应该转换成7
,'E'
应该转换成15
(因为数字的ASCII表示!=那个数字),这种事情最容易用查找表来完成。整数到文本
另一种方法也很简单,你只需要按照正确的顺序打印数字,用一个字符串来保存这些数字就很有帮助了。
同样,“digit for”将
7
转换为'7'
,将15
转换为'E'
。同样,一个简单的查找表(实际上与前面的查找表完全相同)在这里很有用。如果value是
0
,我们应该只使用puts( "0" )
,避免循环。边缘案例
唉,在计算领域,生活从来都不像我们想象的那么简单,我们需要处理负数、INT_MIN、零等等。
对于您正在做的事情,我并不担心,但如果有必要,您可以保留INT_MIN(或您正在处理的任何数据类型)的文本表示,以便与输入进行比较,如果输入与之匹配,则直接分配该值。
您甚至可以通过转换 * 最大 * 可能值、在字符串的最后一个字符上加1并在其前面加上减号来 * 生成 * 这个最小值表示。
当然,如果您正在处理一个 unsigned 类型,就不需要这么麻烦了。
不过,您仍然需要注意溢出。如果您得到的位数超过了结果类型所能容纳的位数...
我们看到杂草使这些东西变得有点棘手。基本的想法很简单,只要确保处理所有奇怪的边缘情况,东西变得不稳定。
gkn4icbw2#
代码中存在多个问题:
int num1 = atoi(argv[1]);
和int num2 = atoi(argv[2]);
是正确的:你应该测试程序接收到的参数的实际数目。remainder = num1 % num2;
而不是remainder = quotient % num2;
,所以您总是得到复制的最后一位。以下是修改后的版本:
tcomlyy63#
这看起来是一个有趣的问题,在我重构初始程序的过程中,我看到其他好的替代方案已经被提供了,为了这个组合,我提供了这个重构版本的基本转换程序。
有一些信息要指出,我做了什么,使基地转换函数。
因此,该方法不使用幂函数,而是导出所需基值的最大幂,然后通过除法和递减过程返回。
根据问题中给出的原始值测试程序,产生以下最终输出。
无论如何,您可能希望将这个重构版本与其他提供的解决方案沿着进行评估,看看它是否符合您的项目的精神。