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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

Проблем с алгоритъм

Featured Replies

Целта на програмата е за въведено N>1, да намери всички N-цифрени числа, които са равни на сумата от N-те степени на своите цифри. Не мога да разбера защо не извежда никакъв резултат на екрана.

#include <iostream>using namespace std;#include <math.h>int main(){	int sum=0;	int n;	int *a=new int[n];	do{		cout<<endl<<"Vyvedete N: ";		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);		if(sum==x) cout<<endl<<chislo;		chislo++;		sum=0;	}}
  • Автор

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

 

Това

	    for(int z=n-1; z>=0;z--)		{			a[z] = chislo % 10;			chislo /= 10;		}

трябва да е

	    for(int z=n-1; z>=0;z--)		{			a[z] = z% 10;		    z/= 10;		}

В случая "z" играе ролята на място в масива. Този цикъл търси отделните цифри на числото, като намирам остатъка при деление и в следствие премахване на последната цифра от числото.

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

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

В случая "z" играе ролята на място в масива. Този цикъл търси отделните цифри на числото, като намирам остатъка при деление и в следствие премахване на последната цифра от числото.

моя грешка, имах предвид x

  for(int z=n-1; z>=0;z--) { a[z] = x% 10;   x/= 10; }

П.П. И няма нужда от нова променлива

  • Автор

Вече бях пробвал по твоя начин и програмата забиваше след като въвеждах N. Би трябвало да си работи нормално, но заради това пробвах с нова променлива, която да заема стойност на "chislo".

Вече бях пробвал по твоя начин и програмата забиваше след като въвеждах N. Би трябвало да си работи нормално, но заради това пробвах с нова променлива, която да заема стойност на "chislo".

тогава ще проверява една стойност.Нали целта е ако въведете примерно 8 да провери всички 8-цифрени числа за условието. Само да припомня че броя на всички осемцифрени числа е 10^8-1 т.е. 100 милиона без 1. Та вие колко време очаквате това да се смята?

П.П. да не говорим че на всяка итерация вие имате две нелеки (от изчислителна гледна точка) операции: делене на 10 и степенуван

  • Автор

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

#include <iostream>using namespace std;#include <math.h>int main(){	int sum=0;	int n, br=0;	char otg;	int *a=new int[n];	do{		cout<<endl<<"Vyvedete N: ";		cin>>n;	}while(n<=1);	int chislo=pow(10,n-1);	for(int x=chislo; x<(pow(10, n)); x++)    {        int buff=chislo;		for(int z=n-1; z>=0;z--)		{			a[z] = buff % 10;			buff /= 10;		}		for(int j=0; j<n; j++)			sum+=pow(a[j],n);		if(sum==x)        {            cout<<endl<<chislo;            br++;        }		chislo++;		sum=0;	}	if (br==0) cout<<"n Nqma chisla, koito da otgovarqt na uslovieto.";	cout<<"n Iskate li novo tursene? (y/n): ";	cin>>otg;	if (otg=='y' || otg=='Y')        main();}

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

  • Автор

Все още не мога да разбера какво намеквате. Като резултат, при N въведено да е 3, получавам 370, 371 и 407. Това не означава ли, че съм обходил всички трицифрени числа и ми е извело числата, които отговарят на условието?

Все още не мога да разбера какво намеквате. Като резултат, при N въведено да е 3, получавам 370, 371 и 407. Това не означава ли, че съм обходил всички трицифрени числа и ми е извело числата, които отговарят на условието?

Сега погледнах, вие увеличавате числото всеки път с 1. Тогава за какво ви е х в цикъла for(int x=chislo; x<(pow(10, n)); x++)

  • Автор

Просто докато пробвах различни начини да тръгне програмата, бях го вкарал това "x". И без него може, но все пак ми е нужна друга променлива, която да заема стойност на "chislo", иначе програмата забива след като въведа N. Това мисля, че се случва в следствие на деление на числото, когато му търся цифрите и затова е нужна друга променлива.

Просто докато пробвах различни начини да тръгне програмата, бях го вкарал това "x". И без него може, но все пак ми е нужна друга променлива, която да заема стойност на "chislo", иначе програмата забива след като въведа N. Това мисля, че се случва в следствие на деление на числото, когато му търся цифрите и затова е нужна друга променлива.

Стремете се кода ви да е чист, пробвайте нещо такова:

И се стремете да правите сметки по веднъж, не на всяка итерация да смятате колко е (pow(10, n)) за да проверявате дали цикъла е стигнал края

	int chislo=pow(10,n-1)int chislo1=(pow(10, n));	for(int x=chislo; x<chislo1; x++){int chislo2=x		for(int z=n-1; z>=0;z--)		{			a[z] = chislo2% 10;		    chislo2/= 10;		}		for(int j=0; j<n; j++)			sum+=pow(a[j],n);		if(sum==x){cout<<endl<<x;br++;}		sum=0;	}

П.П. А е забивало защото вътре в цикъла се променя променливата на цикъла, което е лоша практика :)

  • Автор

Наистина трябваше да го изчистя кода малко, но има още едно нещо. След запитване, дали потребителя иска да направи ново търсене, ако се въведе стойност за N, по-малка от предишното търсене, програмата забива.

Наистина трябваше да го изчистя кода малко, но има още едно нещо. След запитване, дали потребителя иска да направи ново търсене, ако се въведе стойност за N, по-малка от предишното търсене, програмата забива.

Два въпроса.Каква смятате, че е стойността на n (от първоначалната версия на кода, не видях да се променя), към момента:
	int n, br=0;	char otg;	int *a=new int[n]; // <= ето тука???
В кой учебник точно видяхте, че трябва рекурсивно да извиквате главната функция на програмата, за да повтаряте изпълнението ѝ?

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

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

#include <iostream>using namespace std;long pw(int, int);int main(){	long sum, B, E;	int n, br=0;        do{		cout<<endl<<"Vyvedete N[1..9]: ";		cin>>n;	}while((n<1)||(n>9));	B =pw(10,n-1);	E = B * 10;		for(long x=B; x<E; x++) {            long buff=x;            sum = 0;	    for(int i=0; i<n; i++) {		sum += pw(buff % 10,n);		buff /= 10;	    }            if(sum==x) {                br++;                cout<<br<<".  "<<x<<endl;            }	}	if (br==0) cout<<"n Nqma chisla, koito da otgovarqt na uslovieto.n";	system("pause");}long pw(int osn, int stp) {    long res = 1l;    for (int i=0; i<stp; i++) res *= osn;    return res;}

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

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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