Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

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

Featured Replies

Здравейте,

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

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

 

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

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

 

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

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

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

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

Примерно вместо първо да делиш на 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 (преглед на промените)

#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;
}

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

  • 2 седмици по-късно...

Здравейте никога не съм работила с рекурсия, :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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.