Програма на С++

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

Модератори: Methuselah, thegirl

Йовков
От дъжд на вятър
Мнения: 153
Регистриран на: 11 Сеп 2008, 07:17
Пол: Мъж

Програма на С++

Мнение от Йовков »

Едно положително число се нарича автоморфно, ако се съдържа в края на квадрата си. Да се напише програма на С++, извеждаща първите n автоморфни числа.

Може ли помощ, :( ? Трудно ми е това програмиране. Нуждая се от подробни обяснения по програмата, ако може, :? .
Аватар
morfei
Форумно зомби
Мнения: 1975
Регистриран на: 19 Апр 2009, 16:17
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Софията

Re: Програма на С++

Мнение от morfei »

Ще ти дам жокер: автоморфни числа може да са тези които завършват на 1,5, или 6. :wink:
Едит: А какво е ограничението за N?Все пак има огромно значение.
Последно промяна от morfei на 15 Ное 2009, 12:34, променено общо 1 път.
Компютърни науки 1 курс
Йовков
От дъжд на вятър
Мнения: 153
Регистриран на: 11 Сеп 2008, 07:17
Пол: Мъж

Re: Програма на С++

Мнение от Йовков »

Можете ли да напишете програмата, не се сещам как ще стане, :? , аз съм начинаещ в програмирането, :? . А и май сте се объркали с това завършване на 1, 5 или 6:
5.5=25 (автоморфно);
6.6=36 (автоморфно);
11.11=121 (това не е автоморфно, защото не завършва на 11);
15.15=225 (това също не е, защото не завършва на 15).
За броя на числата няма ограничение.
Аватар
morfei
Форумно зомби
Мнения: 1975
Регистриран на: 19 Апр 2009, 16:17
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Софията

Re: Програма на С++

Мнение от morfei »

Не съм се объркал! Затова съм написал МОЖЕ, а не СА. Тоест има смисъл да се проверяват само такива числа. Ти си ме разбрал, че всички, които завърват на тези цифра СА. Сега след малко размишления отхвърлям числата завършващи на 1(освен 1, защото е автоморфно). Колкото за N задължително трябва да има ограничение. По този начин човек се ориентира какъв тип да използва, колко да оптимизира алгоритъма и т.н.
Последно промяна от morfei на 15 Ное 2009, 12:47, променено общо 1 път.
Компютърни науки 1 курс
Аватар
RadoRado
Пишеща машина
Мнения: 898
Регистриран на: 08 Авг 2009, 12:35
Специалност: КН
Пол: Мъж
Курс: първи
Skype: rado_gg
Местоположение: Плевен/София
Обратна връзка:

Re: Програма на С++

Мнение от RadoRado »

Ето малко по-дълго решение, за да е по-ясно.

Код за потвърждение: Избери целия код

#include <iostream>

using namespace std;

int main() {
	int n,m; // durjim vuvedenoto chislo
	cin >> n;
	int square = n*n; // durjim kvadrata
	
	int times = 0; // tuk 6te durjim kolko cifri ima vuvedenoto 4islo
	m=n; // polzvame m, za da ne promenqme n

	while(m != 0) {
		m/=10;
		times++;
	} // iz4islqvame kolko cifri ima 4isloto
	bool ok = true; // flagova promenliva
	//proverqvame poslednite times cifri ot kvadrata
	for(int i = 0; i < times; i++) {
		int k = square % 10; // poslednata cifra ot kvadrata
		int j = n % 10; // poslednata cifra ot 4isloto
		if(k != j) {
			ok = false;
			break;
		}
		square/=10; // i delim, za da ne vzimame vinagi edni i su6ti posledni cifri
		n/=10; // su6toto tuk
	}
	//i ako vsi4ko e ok - avtomorfno
	if(ok)
		cout << "avtomorfno";
	else
		cout << "kofti";


	system("PAUSE");
	return 0;
}
Гейм Дизайн, Gamificiaton, Манипулация :) - http://game-craft.com/blog/
Аватар
morfei
Форумно зомби
Мнения: 1975
Регистриран на: 19 Апр 2009, 16:17
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Софията

Re: Програма на С++

Мнение от morfei »

:shock: :shock: :shock: :shock: :shock:
Не си разбрал правилно задачата. Трябва да се изведат първите N на брой автоморфни числа, а не да се провери дали 1 число е автоморфно. :P
Компютърни науки 1 курс
Аватар
RadoRado
Пишеща машина
Мнения: 898
Регистриран на: 08 Авг 2009, 12:35
Специалност: КН
Пол: Мъж
Курс: първи
Skype: rado_gg
Местоположение: Плевен/София
Обратна връзка:

Re: Програма на С++

Мнение от RadoRado »

Аз задачата я разбрах ;) Човека да разбере кво се прави, пък после няма да му е проблем да си изведе първите n на брой автоморфни.

Код за потвърждение: Избери целия код

#include <iostream>

using namespace std;
bool avtomorfno(int n) {
	int square = n*n;
	bool ok = true;
	while(n) {
		int j = n % 10;
		int k = square % 10;
		if(j != k) {
			ok = false;
			break;
		}
		n/=10;
		square/=10;
	}
	return ok;
}
int main() {
	int n; // първите n
	cin >> n;
	for(int i = 1; i < n; i++) 
		if(avtomorfno(i))
			cout << i << endl;

	system("PAUSE");
	return 0;
}
Гейм Дизайн, Gamificiaton, Манипулация :) - http://game-craft.com/blog/
Аватар
morfei
Форумно зомби
Мнения: 1975
Регистриран на: 19 Апр 2009, 16:17
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Софията

Re: Програма на С++

Мнение от morfei »

Тази програма извежда автоморфните числа в даден интервал. Върви за N<=8. Нека човека да даде ограничението за N и ще видим до колко ще трябва да се оптимизира.
Компютърни науки 1 курс
Аватар
morfei
Форумно зомби
Мнения: 1975
Регистриран на: 19 Апр 2009, 16:17
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Софията

Re: Програма на С++

Мнение от morfei »

Ето едно решение, което е значително по-бързо, но пак повтарям - всичко зависи от N. Ако N е повече от 20 трябва да се потърси по-хитър алгоритъм. Ако някой иска обяснение само да каже. :wink:

Код за потвърждение: Избери целия код

#include<iostream>
using namespace std;
bool automorphic(unsigned long long &a)
{
     unsigned long long r=a,t = a*a;
     bool fl = true;
     while(r>0) {
                if((r%10)!=t%10) {fl=false;break;}
                r/=10;t/=10;
     }
     return fl;
}

int main()
{
    unsigned long long i=5,n;
    cin>>n;
    cout<<1<<' ';n--;
    while(n) {
             if(automorphic(i)) {cout<<i<<' ';n--;}
             i++;
             if(n>0 && automorphic(i)) {cout<<i<<' ';n--;}
             i+=9;       
    }
    cout<<endl;
    system("pause");
    return 0;
}
Компютърни науки 1 курс
Аватар
morfei
Форумно зомби
Мнения: 1975
Регистриран на: 19 Апр 2009, 16:17
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Софията

Re: Програма на С++

Мнение от morfei »

Една малка оптимизацийка: да се замени следния ред:

Код за потвърждение: Избери целия код

unsigned long long r=a,t = a*a;
със

Код за потвърждение: Избери целия код

unsigned long long r = a/10,t = a*a/10;
По принцип изглежда незначителна, но всъщност не е поради големия брой изпълнения на оператора присвояване и деление.
Компютърни науки 1 курс
Аватар
RadoRado
Пишеща машина
Мнения: 898
Регистриран на: 08 Авг 2009, 12:35
Специалност: КН
Пол: Мъж
Курс: първи
Skype: rado_gg
Местоположение: Плевен/София
Обратна връзка:

Re: Програма на С++

Мнение от RadoRado »

Чак сега прочетох условието както трябва ;Д, pardon me.
ето обосновка и бързо решение :
http://en.wikipedia.org/wiki/Automorphic_number
Гейм Дизайн, Gamificiaton, Манипулация :) - http://game-craft.com/blog/
Йовков
От дъжд на вятър
Мнения: 153
Регистриран на: 11 Сеп 2008, 07:17
Пол: Мъж

Re: Програма на С++

Мнение от Йовков »

morfei написа:Ето едно решение, което е значително по-бързо, но пак повтарям - всичко зависи от N. Ако N е повече от 20 трябва да се потърси по-хитър алгоритъм. Ако някой иска обяснение само да каже. :wink:

Код за потвърждение: Избери целия код

#include<iostream>
using namespace std;
bool automorphic(unsigned long long &a)
{
     unsigned long long r=a,t = a*a;
     bool fl = true;
     while(r>0) {
                if((r%10)!=t%10) {fl=false;break;}
                r/=10;t/=10;
     }
     return fl;
}

int main()
{
    unsigned long long i=5,n;
    cin>>n;
    cout<<1<<' ';n--;
    while(n) {
             if(automorphic(i)) {cout<<i<<' ';n--;}
             i++;
             if(n>0 && automorphic(i)) {cout<<i<<' ';n--;}
             i+=9;       
    }
    cout<<endl;
    system("pause");
    return 0;
}
Dev C++ дава съобщение за две грешки, :cry: . На вас компилира ли ви я?
Аватар
bggashnik
Пишеща машина
Мнения: 871
Регистриран на: 01 Фев 2009, 18:44
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Плевен/София

Re: Програма на С++

Мнение от bggashnik »

Компилира ми го, да! И аз съм с Дев. Мисля, че някъде в нета върлуваше един бъгав Дев, изтегли си друг :roll: :wink:
Компютърни науки I курс
Аватар
morfei
Форумно зомби
Мнения: 1975
Регистриран на: 19 Апр 2009, 16:17
Специалност: Компютърни науки
Пол: Мъж
Курс: първи
Местоположение: Софията

Re: Програма на С++

Мнение от morfei »

Ако не ми се компилираше нямаше да ти дам кода. :P
Изтегли го от тук:
http://sourceforge.net/projects/dev-cpp ... e/download
Компютърни науки 1 курс
Йовков
От дъжд на вятър
Мнения: 153
Регистриран на: 11 Сеп 2008, 07:17
Пол: Мъж

Re: Програма на С++

Мнение от Йовков »

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

Бихте ли написали програмата, за да сверя с това, което аз измислих? Все още ми е малко трудно програмирането на С++, :| .
Публикувай отговор

Обратно към “ФМИ”