Премини към съдържанието
  • Добре дошли!

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

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

     

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

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

Spydoc

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

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


Целта на програмата е за въведено 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;	}}

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


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

Това

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

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


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

Открих си грешката. При търсене на отделните цифри на числото, променливата заема нова стойност. Просто вкарах нова променлива, която да бъде равна на "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" играе ролята на място в масива. Този цикъл търси отделните цифри на числото, като намирам остатъка при деление и в следствие премахване на последната цифра от числото.

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


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

Открих си грешката. При търсене на отделните цифри на числото, променливата заема нова стойност. Просто вкарах нова променлива, която да бъде равна на "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();}

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


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

Втори път: Вие проверявате едно и също число! Нали идеята е да проверявате различни числа!

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


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

Все още не мога да разбера какво намеквате. Като резултат, при 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]; // <= ето тука???
В кой учебник точно видяхте, че трябва рекурсивно да извиквате главната функция на програмата, за да повтаряте изпълнението ѝ?

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


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

Този масив го дефинира по умопомрачителен начин, а на практика е напълно излишен -намерили поредната цифра може директно да я дигне на степен 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;}

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


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

×
×
  • Добави ново...