2012-06-29 4 views
1

1 х 2 + 1 х 2 + 1 х 2 + 0 × 2 + 1 х 2 = 1 + 2 х (1 + 2 х (1 + 2 х (0 + 2 х 1)))двоичных чисел в десятичные с помощью Хорнер

Напомним b[0] = 1, b[1] = 1, b[2] = 1,b[3] = 0, b[4] = 1

/* to convert a binary representation to a decimal one*/ 

int dec, b[5] = {1, 1, 1, 0, 1}; 
dec = b[4]; 
for (int i = 3; i >= 0; i--) 
{ 
    dec=2 * dec + b[i]; //horner's scheme 
} 
cout << dec << endl; 

Я попытался написать этот код еще раз на языке C, но это не работает правильно:

#include<stdio.h> 

int main() 
{ 
    int B[5]; 
    int x, s, s1; 

    for(int i = 1;i <= 5; i++) 
    { 
     printf("Enter %d. digit of binary number", i); 
     scanf("%d", &B[i]); 
    } 


    s = B[5]; /*this part for reverse the array*/ 
    B[5] = B[1]; 
    B[1] = s; 

    s1 = B[4]; 
    B[4] = B[2]; 
    B[2] = s1; 

    x = B[4]; 

    for (int i = 3; i >= 0; i--) 
    { 
     x = 2 * x + B[i]; 
    } 

    printf("%d", x); 
    scanf("%d"); 
} 

ответ

2

Это ваш первоначальный цикл, где вы инициализацию массива B

int B[5]; 
    int x,s,s1; 
    for(int i=1;i<=5;i++) { 
    printf("Enter %d. digit of binary number",i); 
    scanf("%d",&B[i]);} 

что плохо, как вы обращаетесь к элементу B[5], который находится за пределами вашего массива в любом случае, но вы никогда не инициализацией B[0] которые вы используете в вашем втором цикле

x=B[4]; 
    for (int i=3;i>=0;i--) 
    { 
     x=2*x+B[i]; 
    } 

попробуйте изменить свой первый цикл в

for(int i=0;i<5;i++) { 
     printf("Enter %d. digit of binary number",i); 
     scanf("%d",&B[i]); 
    } 

и посмотреть, дает ли это результат, которого вы ожидаете.

Кроме того, этот код

s=B[5]; /*this part for reverse the array*/ 
    B[5]=B[1]; 
    B[1]=s; 

    s1=B[4]; 
    B[4]=B[2]; 
    B[2]=s1; 

есть проблемы, потому что вы объявили B как массив из 5 целых чисел и, поскольку массивы имеют индексы с нуля, только значения для индекса, которые действительны от 0 до 4. Если вы хотите, чтобы изменить массив правильно заменить код с

s=B[4]; /*this part for reverse the array*/ 
    B[4]=B[0]; 
    B[0]=s; 

    s1=B[3]; 
    B[3]=B[1]; 
    B[1]=s1; 

вы не должны получить доступ к B [5], поскольку это находится за пределами вашего массива !!!!

+0

s = B [5]; B [5] = B [1]; B [1] = s; s1 = B [4]; B [4] = B [2]; B [2] = s1; Я думаю, что там проблема здесь, когда я удаляю эту часть, она работает, но работает для обратного номера. когда я хочу преобразовать этот 11000, он работает на 00011, поэтому я не могу удалить – allstar

+0

. Ваш код не может установить значение для B [0], поэтому вы не можете полагаться на то, что вы думаете, пока не исправите его. – mathematician1975

+0

@allstar Проверьте обновленный ответ - это должно решить вашу проблему сейчас – mathematician1975

0

Вам не нужно возвращать массив.

+0

, но в других случаях, когда я хочу конвертировать это 11000, он работает на 00011 – allstar

+0

@allstar Просто убедитесь: в каком порядке вы вводите биты для номер 3: 11000 или 00011? – Benoit

+0

@allstar 3 = 1 x 2^0 +1 x 2^1 + 0 x 2^2 + 0 x 2^3 + 0 x 2^4 В начале вашего вопроса: 3 -> b = { 1,1,0,0,0} – Benoit

Смежные вопросы