2013-09-21 3 views
0

Так что у меня проблемы с назначением для класса. Цель состоит в том, чтобы взять вектор длины n, заполненный только двоичными целыми числами (0 или 1). Ex. [1,1,0,1], где v [0] = 1, v [1] = 1, v [2] = 0, v [3] = 1. Выход функции ItBin2Dec выводит вектор цифр, представляющих такое же целое число. Итак, [1,1,0,1] => [1,3] (для 13). Я не отличный программист, поэтому я попытался следовать алгоритму, предоставленному нам. Любые советы будут очень признательны.Преобразование вектора двоичных целых чисел в вектор цифр

/* Algorithm we are given 

function ItBin2Dec(v) 
Input: An n-bit integer v >= 0 (binary digits) 
Output: The vector w of decimal digits of v 

Initialize w as empty vector 
if v=0: return w 
if v=1: w=push(w,1); return w 
for i=size(v) - 2 downto 0: 
    w=By2inDec(w) 
    if v[i] is odd: w[0] = w[0] + 1 
return w 

*/ 

#include <vector> 
#include <iostream> 

using namespace std; 

vector<int> ItBin2Dec(vector<int> v) { 
    vector<int> w; // initialize vector w 
    if (v.size() == 0) { // if empty vector, return w 
     return w; 
    } 
    if (v.size() == 1) { // if 1 binary number, return w with that number 
     if (v[0] == 0) { 
      w.push_back(0); 
      return w; 
     } 
     else { 
      w.push_back(1); 
      return w; 
     } 
    } 
    else { // if v larger than 1 number 
     for (int i = v.size() - 2; i >= 0; i--) { 
      w = By2InDec(w); // this supposedly will multiply the vector by 2 
      if (v[i] == 1) { // if v is odd 
       w[0] = w[0] + 1; 
      } 
     } 
    } 
    return w; 
} 

vector<int> By2InDec(vector<int> y) { 
    vector<int> z; 
    // not sure how this one works exactly 
    return z; 
} 

int main() { 
    vector<int> binVect; // init binary vect 
    vector<int> decVect; // init decimal vect 

    decVect = ItBin2Dec(binVect); // calls ItBin2Dec and converts bin vect to dec vect 
    for (int i = decVect.size(); i >= 0; i--) { // prints out decimal value 
     cout << decVect[i] << " "; 
    } 
    cout << endl; 



    return 0; 
} 

Прошло некоторое время с тех пор, как мне пришлось закодировать что-либо, поэтому я немного ржавый. Очевидно, я еще не определился с фактическими входами, просто попробовав сначала получить скелет. Фактическое задание запрашивает умножение векторов двоичных цифр, а затем выводит результирующий вектор цифр, но я решил, что начну с этого первого и работаю оттуда. Благодаря!

ответ

1

Преобразование числа из двоичной системы счисления в десятичную легко, поэтому я предлагаю вам сначала вычислить десятичное число, а затем получить цифры номера:

int binary_to_decimal(const std::vector<int>& bits) 
{ 
    int result = 0; 
    int base = 1; 

    //Supposing the MSB is at the begin of the bits vector: 
    for(unsigned int i = bits.size()-1 ; i >= 0 ; --i) 
    { 
     result += bits[i]*base; 
     base *= 2; 
    } 

    return result; 
} 

std::vector<int> get_decimal_digits(int number) 
{ 
    //Allocate the vector with the number of digits of the number: 
    std::vector<int> digits(std::log10(number) - 1); 

    while(number/10 > 0) 
    { 
     digits.insert(digits.begin() , number % 10); 
     number /= 10; 
    } 

    return digits; 
} 


std::vector<int> binary_digits_to_decimal_digits(const std::vector<int>& bits) 
{ 
    return get_decimal_digits(binary_to_decimal(bits)); 
} 
+0

Мне нравится этот метод. Однако он не отвечает требованиям задания. Предположим, мы сможем передать ему вектор> 300 1 (до 1600), и поскольку это действительно позволяет мне вводить 32 1, это в конечном итоге переполнит и вызовет ошибки. Это то, чего хочет нас наш профессор. Я выбираю это как правильный ответ, потому что это определенно дает мне хорошее место для начала. Благодаря! – Scott

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