Премини към съдържанието
Maria11

Помощ за задача свързана с рекурсия

Препоръчан отговор


Здравейте,

Затруднявам се на следната задача:

Да се състави програма, която извежда на екрана двоичния код на дадено цяло число, без използване на масив.

 

Т.е разбирам като въведа от клавиатура числото 11 да ми изведе двоичния му код 1011.

Въпросът ми е как става това. Искам пример или кратък фрагмент от част от кода в който задаваме командата за превръщане в двоичен код.

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

преди 58 минути, Maria11 написа:

Въпросът ми е как става това. Искам пример или кратък фрагмент от част от кода в който задаваме командата за превръщане в двоичен код.

Конвертиране от една в друга бройна система става чрез делене/остатък на базата на изходната бройна система - остатъкът дава поредната цифра.  Трикът тук е че цифрите се получават отзад напред и отпечатването ще стане трудно без масив. Може да стане като ги записваш в десетично число, което е съставено от единици и нули.

  • Харесва ми 3

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами може да се започне с много-голямо число, докато не получиш първата единица и със нея да започнеш да изкарваш двоичния код. Така ще ги изкарваш в правилния ред.

Примерно вместо първо да делиш на 2 на нулева степен, можеш първо да делиш на 2 на 128 степен и така наобратно до 0 да изкарваш директно 0-те и 1-ците.

 

Ето го и псевдо кода:

int function( $arg){

for( i = 128 ; i > 0; --i ){

tmp_potent = 2 ^ i ;

if( arg > tmp_potent ){ cout < 1 ; arg -= tmp_potent; }else{ cout < 0 ; }

}

}

Редактирано от georgi22 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

11:2=5:2=2:2=1
-    -   -
10   4   2
_    _   _
1    1   0

N=3 (операции деление)

От дясно наляво обери цифрите 1 0 1 1

1*10^3+0*10^2+1*10^1+1*10^0=1011
O1*10^N + O2*10^(N-1) +...+ ON*10^0

Завърти един цикъл в който да намериш N такова, че 2^N<зададеното число<2^(N+1)

Сега задаваш цикъл в който извършваш самото деление.

Редактирано от ExaFlop (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Един много прост вариант - но пък като всяко просто ... нещо, не може да се разлага на по-прости. Две променливи: DEC - десетично число и BIN - стринг и много вложени функции if.

int main()
{
int DEC;
string BIN;
If (DEC=0)
	BIN="0000"
	return;
	else If (DEC=1)
		then BIN="0001"
		return;
		else If (DEC=2)
			...
}

PS. Казахме без масив - формално условието не е спазено. Стринга на практика си е масив  :) макар и статичен..

Редактирано от jhoro (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
void bin(int x)
{
    if (x>1) bin(x/2);
    cout<<x%2;
}

Горната функция работи само с положителни числа, за отрицателните не знам как е по-добре да се вадят със знак или в допълнителен код

void bin(int x)
{
     if (x<0) {cout<<'-';x=-x;}
     if (x>1) bin(x/2);
     cout<<x%2;
}

или

void bin(int x)
{
    unsigned y=(unsigned)x; 
    if (y>1) bin(y/2);
    cout<<y%2;
}

 

Редактирано от ined (преглед на промените)
  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
#include "stdafx.h"
#include <iostream>

const int monst = sizeof(unsigned) * 8;

void printbits(unsigned n)
{
	int i;
	bool flag = false;
	int temp;
    if (n==0)
    {
     	std::cout << n; 
      	return;
    }  
	for (i = 0; i < monst; i++)
	{
		temp = ((n << i) >> (monst - 1)) & 1;
		if (temp) flag = true;
		if (flag) std::cout << temp;
	}
}



int _tmain(int argc, _TCHAR* argv[])
{
	unsigned mint;
	std::cin >> mint;
	printbits(mint);
	return 0;
}

 

Язък за барута, то трябвало с рекурсия.

Редактирано от Реджеп Иведик (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
#include "stdafx.h"
#include <iostream>

void printbitsr(unsigned n)
{
	if (n == 0) return;
	printbitsr(n >> 1);
	std::cout << (n & 1); 
}

void pbs(unsigned p)
{
	if (p == 0)
	{
		std::cout << 0;
		return;
	}
	printbitsr(p);
}


int _tmain(int argc, _TCHAR* argv[])
{
	unsigned munsigned;
	std::cin >> munsigned;
	pbs(munsigned);
	return 0;
}

С рекурсия хем

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ама то с рекурсия може да се класифицира като измама, щото като не може с масив и стека е масив

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравейте никога не съм работила с рекурсия, :no-no:,може ли някой да напише коментари по тази същата задача, за да разбера за какво става въпрос,
благодаря ви предварително :min08:

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 26 минути, honeybatman написа:

Здравейте никога не съм работила с рекурсия, :no-no:,може ли някой да напише коментари по тази същата задача, за да разбера за какво става въпрос,
благодаря ви предварително :min08:

Ето - Рекурсия

Рекурсия[1]
Произход - от лат. recurrere. Програмна техника, която включва в себе си използването на процедури, подпрограми, функции или алгоритми, които извикват свои опростени версии един или повече пъти, при решаването на определен проблем (докато дадено условие е изпълнено), през което време резултатът от всяко повторение се изпълнява от последното извикано повторение в посока първото.
Рекурсията е програмна техника, чиято правилна употреба води до елегантни решения на определени проблеми. Понякога нейното използване опростява значително кода и подобрява четимостта му.

Рекурсивен[2]
Характеризира повтаряемост, по-конкретно:
В математиката и лингвистиката - свързана с или включваща многократното приложение на правило, дефиниция или процедура с цел последващ резултат.
В програмирането - отнасяща се за или включваща програма, за чието частично приложение се изисква прилагането на цялото, така че неговата изрична интерпретация изисква множество последващи изпълнения: рекурсивна подпрограма.
Един обект наричаме рекурсивен, ако съдържа опростен свой вариант или е дефиниран от по-опростена своя версия.

Има и още - но ще си го прочетеш сама.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Без масиви и рекурсия.

       

        int32_t number(0);

        decltype(number) mask(1<<sizeof(number)*8-2);
        cin>>number;

        if(number<0)  cout<<1;
        else cout<<0;

        for( size_t i(sizeof(number)*8-1); i>0; --i ) {
                if( number&mask ) cout<<1;
                else cout<<0;
                mask>>=1;
        }

       cout<<flush;

Редактирано от programprogram (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Горещи теми в момента

  • Подобни теми

    • от Chris Panov
      Здравейте, 
      В момента пиша една програма, в която в една от функциите ми се налага да излезна по-рано при определено условие. Функцията връща string впрочем.
      Ето кодът:
       
      #include "stdafx.h" #include <iostream> #include <string> #include <sstream> #include <vector> #define CONSOLE_LOG(x) std::cout << x #define COMMAND_END command[0] #define COMMAND_SUM command[1] #define COMMAND_SUBTRACT command[2] #define COMMAND_CONCAT command[3] #define COMMAND_DISCARD command[4] #define COMMAND_DISPSEQ command[5] template <typename T> void top_back(std::vector<T>& v) {     v.erase(v.end() - 1); } std::string sum(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt + yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string subtract(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt - yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } } void dispseq(std::vector<std::string>& vec) {     std::vector<std::string>::const_iterator iter;     for (iter = vec.begin(); iter != vec.end(); iter++)     {         std::cout << *iter << std::endl;     } } void enterSequence() {     std::vector<std::string> command =     {         "end",         "sum",         "subtract",         "concat",         "discard",         "dispseq"     };     std::vector<std::string> sequence;     std::string input;     std::string a;     std::string b;     do     {         std::cin >> input;         sequence.emplace_back(input);         if (input == COMMAND_END)         {              top_back(sequence);         }         if (input == COMMAND_SUM)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(sum(a, b, sequence));         }         if (input == COMMAND_SUBTRACT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(subtract(a, b, sequence));         }         if (input == COMMAND_CONCAT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(concat(a, b, sequence));         }         if (input == COMMAND_DISCARD)         {             top_back(sequence);             top_back(sequence);         }         if (input == COMMAND_DISPSEQ)         {             top_back(sequence);             dispseq(sequence);         }     } while (input != COMMAND_END); } int main() {     enterSequence();     std::cin.get();     std::cin.get();     return 0; } И ето проблемната функция:
       
      std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } }  
      Както виждате ако стрингът x(който естествено го превръщам в интиджър) е по-малък от 0, теоритично трябва да излезна от функцията, и това е единственият начин за който се сетих, с return;, обаче пък компилаторът иска функцията да връща стойност, понеже е от тип стринг.
      Как да съчетая двете? - да връща стринг ако всичко е по план, и да излиза ако е по-малко от 0.
    • от Chris Panov
      Здравейте,
      В момента имам сериозен проблем със взимането на броят на елементи в даден вектор.
      vec.size(); и  
      sizeof(vec) / sizeof(vec[0]); не работят. Програмата те пита за брой ключове за даден тест, въвеждаш ключовете, после въвеждаш и отговорите, които са били дадени, и програмата ги сравнява и в зависимост от това колко верни отговори имаш ти дава точки. Ключовете и дадените отговори са тип char. ("A", "B", "C" etc.)
      Ето го и кода, като повечето съм го направил на коментар за да си тествам само функцията която извежда броя на елементите.
      #include "stdafx.h" #include <iostream> #include <vector> #define CONSOLE_LOG(x) std::cout << x; std::vector<char> keys = {'A', 'B', 'C', 'D', 'E'}; std::vector<char> studentAnswers; int n, points = 0; char key, answer; template <typename T> T vecSize(std::vector<T>& vec) { T size = vec.size(); return size; } /* template <typename T1> void enterKeys(std::vector<T1>& k) { CONSOLE_LOG("Please enter the number of keys: "); std::cin >> n; for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Key " << counter << ": "); std::cin >> key; k.emplace_back(key); } } template <typename T2> void enterAnswers(std::vector<T2>& stAns) { for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Answer " << counter << ": "); std::cin >> answer; stAns.emplace_back(answer); } } template <typename T3> void getGrade(std::vector<T3>& x, std::vector<T3>& y) { for (int i = 0; i < n; i++) { if (x[i] == y[i]) { points++; } } CONSOLE_LOG("Points: " << points); } */ int main() { /* enterKeys(keys); enterAnswers(studentAnswers); getGrade(studentAnswers, keys); */ std::cout << keys.size() << std::endl; std::cout << vecSize(keys) << std::endl; std::cin.get(); std::cin.get(); std::cin.get(); return 0; } Опитах всевъзможни начини, и пак не става. Идеята е да заместя n променливата със броя на елементите от вектора. Програмата върви по един и същи начин, защото все пак в n променливата запазваме големината на вектора, но бих искал да си го направя с функция.
      Както виждате на края на програмата си извеждам тестове. Първият, който си е по конвенционалният метод си работи сам по себе си, но пък във for цикъл не бачка.
      А вторият е функцията която съм направил. Проблемът е че ми извежда непознат символ - "�"
      Проблемът е че типът на елементите във вектора е char, защото като го направих с int тип си работеше както трябва.
      Бих бил изключително благодарен ако някой може да ме насочи и да ми бутне едно рамо :)
    • от Goshko
      Да се напише програма, която създава структура "Book" като имате следните полета - Title(заглавието на книгата), Автор(Author), Цена(Price) и уникален номер на книгата(ISBN-num). Да се ваведе цяло число n и след него n на брой данни за ученика. Да се изведе на монитора данните за книгата с цена по-висока от предварително зададена.
    • от Нели Николова
      Здравейте, имам две готови задачи, но не мога да ги компилирам. Дали може да ги проверите?
      зад.1 Да се състави програма, която да сортира едномерен масив от цели числа тип short  с име X състоящ се от 19 елемента. Сортирането да се извърши във възходящ ред чрез метода пряка селекция.
      #include <iostream>
      using namespace std;
      void sortAsc(short[]);
      int main() {
          short x[] = {123,13,23,31,1,55,36,17,8,9,10,11,6,12,14,15,16,35,184,19};
           
          sortAsc(x);
          
          return 0;
      }
      void sortAsc(short x[]){
          for(short i = 0; i < 19 ; i++) {
              for(short j = i; j < 19; j++) {
                  if(x[j] < x) {
                      swap(x[j], x);
                  }
              }    
          }
          
          for(int i=0; i<19; i++)
          {
              cout << x << endl;
          }
      }
      зад. 2 Да се състави програма,която реализира динамичен стек от реални числа тип float. Стекът да се преобразува в два нови стека, един стек P за четните и един стек O за нечетните числа от стек едно. Стековете да се извеждат на екрана.
      int main() {
          stack<float>numbers;
          stack<float>p;
          stack<float>o;
          
          for(short i = 1; i <= 200; i++) {
              numbers.push(i);
          }  
          
          numbers.push(200.64);
          numbers.push(203.34);
          
          while(!numbers.empty()) {
              int number = numbers.top();
              
              if (number % 2 == 0) {
                  p.push(number);
              } else {
                  o.push(number);
              }
              numbers.pop();
          }
          
          cout << "EVEN NUMBERS:" << endl;
          
          while(!p.empty()) {
              cout << p.top() << endl;
              p.pop();
          }
          
          cout << "ODD NUMBERS:" << endl;
          
          while(!o.empty()) {
              cout << o.top() << endl;
              o.pop();
          }
          
      }
      Много Ви благодаря :)
       
    • от Georgi Kirchev
      Здравейте имам да предам курсова работа утре ,но не мога да я реша , ще бъда изключително благодарен ако може някой да ми помогне.

      Дефинирайте клас Телевизор, който да е родител на клас Самсунг и клас Сони. Клас Телевизор да има цена и брой продадени за година в сектор private. Класовете Самсунг и Сони да имат в сектор public функции за определяне на общата сума от продажби за година (цена * брой продадени за година). Всички класове да имат конструктори по подразбиране.
       
      Благодаря предварително !
  • Дарение

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.