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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

Помощ за алгоритъм на c++

Featured Replies

Здравейте, имам следната задача на С++: "Да се състави програма, която за дадено N>1, намира всички N-цифрени числа, които са равни на сумата от N-те степени на своите цифри." Алгоритъмът, който аз измисли е следния- при зададено N (примерно 3) си генерирам числото 100, което се инкрементира то 999 (преди да стане 4-цифрено), също се създава масив с 3 елемента {1, 0, 0} (в този случай с- 3- цифрени числа), за да мога да намирам сумата от отделните цифри в числото на Nта степен. Проблемът е в това, че не мога да инкрементирам правилно този масив с отделните чилса... ако може някой да ми помогне, благодаря :)

  • Автор

Как да отделя цифрите от цяло число?? Явно аз незнам как...

Как да отделя цифрите от цяло число?? Явно аз незнам как...

В един цикъл, започващ от броя на цифрите D до 1, последователно делиш по модул 10 и нормално делене на 10, а цифрите съхраняваш в един масив с няколко клетки.

Нещо такова :

num е поредното число

for ( i = d ; i >= 1; i--)

{

arr = num % 10;

num /= 10;

}

След цикъла ще имаш в arr цифрите на числото.

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

  • Автор

В един цикъл, започващ от броя на цифрите D до 1, последователно делиш по модул 10 и нормално делене на 10, а цифрите съхраняваш в един масив с няколко клетки.

Нещо такова :

num е поредното число

for ( i = d ; i >= 1; i--)

{

arr = num % 10;

num /= 10;

}

След цикъла ще имаш в arr цифрите на числото.

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

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

#include <iostream.h>
#include <math.h>

void suma(int chislo, int i);

int n;	
int *a=new int[n];	//dinami4en masiv za otdelnite cifri na 4isloto



void main()
{
	int i=0;
	int sum=0;

	do{
		cout<<endl<<"Vavedete N (N>1): ";
		cin>>n;
	}while(n<=1);
	
	int chislo=pow(10,n-1);

	for(int x=chislo; x<(pow(10, n)); x++){	
		suma(chislo, i);	//vika suma(),koqto otdelq cifrite na chislo v masiva a[n]
	
		for(int j=0; j<n; j++)
			sum+=pow(a[j],n);	//presmqta sumata na n-te stepeni na cifrite
		
		if(sum==chislo) cout<<endl<<chislo;
		
		chislo++;	
		sum=0;
		i=0;
	}
}

void suma(int chislo, int i)
{
	if(i>n) return;

	int buf;
	int buf2=pow(10,n-1-i);
	
	buf = chislo%buf2;
	a[i]=chislo/buf2;

	suma(buf, i+1);
}

Сега ще се опитам по твоя начин да я напиша. :ph34r:

Ето и по твоя начин. Пак не връща нищо, но вече взех да си мисля, че няма такива числа :speak: не виждам къде може да има грешка

#include <iostream.h>
#include <math.h>

void main()
{
	int sum=0;
	int n;	
	int *a=new int[n];	//dinami4en masiv za otdelnite cifri na 4isloto


	do{
		cout<<endl<<"Vavedete N (N>1): ";
		cin>>n;
	}while(n<=1);
	
	int chislo=pow(10,n-1);

	for(int x=chislo; x<(pow(10, n)); x++){	
		for(int z=n-1; z>=0;z--){
			a[z] = chislo % 10;
			chislo /= 10;
		}
 
	
		for(int j=0; j<n; j++)
			sum+=pow(a[j],n);	//presmqta sumata na n-te stepeni na cifrite
		
		if(sum==chislo) cout<<endl<<chislo;
		
		chislo++;	
		sum=0;
	}
}

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

  • 5 години по-късно...
#include <iostream>

using namespace std;

int pow(int x, int n)
{
    int i,r=x;
    for (i=1; i<n; ++i)
        r*=x;
    return r;
}
 
int sum(int x, int n)
{
    int s=pow(x%10,n);
    if (x>10) s+=sum(x/10,n);
    return s;
}  
         

int main()
{
    int n,b,e=1;
    for (n=1; n<10;++n)
    {
        cout<<"n = "<<n<<endl;
        b=e; e*=10;
        for(int i=b; i<e; ++i)
            if (sum(i,n)==i) cout<<i<<endl;  
    }
	return ;
}

 

N = 8 и 9 малко бавно го смята, може да се ускори ако се раздели цикъла на два отделни

int main()
{
	int n,b,e=1,s;
    int em,step=1000;
	for (n=1; n<10;++n)
	{
        cout<<"n = "<<n<<endl;
        b=e; e*=10;
        if (n<7) {
            for (int i=b; i<e; ++i)
                if (sum(i,n)==i) cout<<i<<endl;
        }  else  {
            for(int i=b; i<e; i+=step)
            {
                s=sum(i/step,n)-i;
                for (int j=0; j<step; ++j)
                   if (s+sum(j,n)==j) cout<<i+j<<endl;  
            }
        }
    }
	return 0;
}

 

Добавете отговор

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

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

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

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

Дарение

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

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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