【发布时间】:2021-08-29 20:00:01
【问题描述】:
我必须编写一个转换器,从numbers[] 获取字符串并将它们输出为小数。
我循环遍历大小和索引,然后将当前索引与其位置的幂相加,然后将其全部加起来。比如:101 = 1^2 + 0^1 + 1^0
所以我目前对此感到困惑:
#include <stdio.h>
#include <math.h> // Kompilieren mit -lm : gcc -Wall -std=c11 dateiname.c -lm
int main() {
char* numbers[] = {
"01001001",
"00101010",
"010100111001",
"011111110100101010010111",
"0001010110011010101111101111010101110110",
"01011100110000001101"};
// Add here..
int strlen(char *str){
int len=0;
for(;str[len]!='\0';len++){}
return len;
}
int sum = 0;
int length = sizeof(numbers) / sizeof(numbers[0]);
for( int i = 0; i < length; i++ ){
int size = strlen(numbers[i]);
for (int j = 0; j < size; j++) {
if(numbers[i][j] == '1'){
sum += 1 * pow(2,j-1);
}else{
sum += 0 * pow(2,j-1);
}
}
printf("%s to the base of 2 \nequals %d to the base of 10 \n\n",numbers[i], sum);
sum = 0;
}
return 0;
}
前两个循环的输出是正确的,即 01001001 = 73 和 00101010 = 42。但是,一旦长度变大,我的输出就完全错误了;例如010100111001 = 1253 而不是 1337 和 011111110100101010010111 = 7645567 而不是 8342167。
【问题讨论】:
-
j从左边开始数,但如果使用2**j,j必须从右边开始计算。您的前两个数字恰好是正确的,因为它们几乎是对称的。 -1 的偏移量以“修复”来掩盖错误。 -
不要使用
pow获得 2 的整数幂:使用移位。另请注意,第五个字符串的位数太多,无法转换为 32 位int。 “二进制到十进制转换”也是不正确的,它将数字字符串转换为二进制。二进制转十进制由printf完成。