【发布时间】:2012-10-09 07:57:57
【问题描述】:
所以我在这里有这段代码,它(现在)只是将 base1 数字转换为 base 10 数字
/**
* This function is supposed to convert 'number' from base1 to a number in base2.
* It isn't fully implemented yet, and I've only converted base1 to a base 10 number.
*/
void base1_base2(int base1, int base2, int number) {
int num, place = 0;
int rem = number;
int i;
for (i = 0; i < num_digits(number); i++) {
int mod = rem % 10;
rem = floor(rem / 10);
int powerResult = pow(base1, place++);
num = num + mod * powerResult;
}
int base10_num = num;
printf("The number %i(base%i) in base 10 is: %i\n", number, base1, base10_num);
}
这会计算出正确的 base10 数,即函数调用 base1_convert(2, 5, 100) 将返回 4,正如预期的那样:
The number 100(base2) in base 10 is: 4
当我在该函数的最后一个 printf 正下方添加这段代码时,问题就出现了:
int base2_num = 0;
printf("The number %i(base%i) is: %d\n", number, base1, base2_num);
如果加上上面的代码,它完全改变了第一个printf的结果,使其返回:
The number 100(base2) in base 10 is: 4196784.
The number 100(base2) is: 0
我一生都无法弄清楚为什么会发生这种情况。我猜它与一些指针有关,但我并没有真正使用过任何指针,而且我不知道为什么添加一个看似独立的变量 int base2_num = 0; 会改变这一切。
这是添加上述行后的完整修改代码。
void base1_base2(int base1, int base2, int number) {
int num, place = 0;
int rem = number;
int i;
for (i = 0; i < num_digits(number); i++) {
int mod = rem % 10;
rem = floor(rem / 10);
int powerResult = pow(base1, place++);
num = num + mod * powerResult;
}
int base10_num = num;
printf("The number %i(base%i) in base 10 is: %i\n", number, base1, base10_num);
int base2_num = 0;
printf("The number %i(base%i) is: %d\n", number, base1, base2_num);
return;
}
编辑:这是我使用的唯一其他函数,num_digits。它返回整数的位数。
int num_digits(int integer) {
char int_string[100];
int str_length;
sprintf(int_string, "%i", integer);
str_length = strlen(int_string);
return str_length;
}
这里是我调用函数的地方:
int main() {
printf("Hello World\n");
base1_base2(2, 5, 100);
return 0;
}
【问题讨论】:
-
什么是
base1号码? -
@gokcehan:“鸡抓痕”,就像我们以前所说的那样:位数就是值。
-
@Michael:不提供sscce(简单、独立、可编译的示例)被认为是不好的方式。为了重现您的问题,我必须编写一个
main()来为其提供数字,这就是我对帮助您失去兴趣的地方。 -
在循环中,如果
rem在base1中,那么在抓位的时候把它当成十进制数就显得很奇怪了(与% 10等等)。 -
@Michael:点击我评论中的链接。它详细解释了它。要点:提供
main()。包括所有必要的标头(在这种情况下,stdio、match、string)。应该可以复制、粘贴、编译您的示例并立即获得与您相同的结果。 (MWE,最小可行示例,是这个的另一个首字母缩写词。)