| forum.uni-sofia.bg https://forum.su.schools.bg/ |
|
| Програма на С++ https://forum.su.schools.bg/viewtopic.php?f=55&t=16051 |
Страница 1 от 3 |
| Автор: | Йовков [ 15 Ное 2009, 12:08 ] |
| Заглавие: | Програма на С++ |
Едно положително число се нарича автоморфно, ако се съдържа в края на квадрата си. Да се напише програма на С++, извеждаща първите n автоморфни числа. Може ли помощ, |
|
| Автор: | morfei [ 15 Ное 2009, 12:22 ] |
| Заглавие: | Re: Програма на С++ |
Ще ти дам жокер: автоморфни числа може да са тези които завършват на 1,5, или 6. Едит: А какво е ограничението за N?Все пак има огромно значение. |
|
| Автор: | Йовков [ 15 Ное 2009, 12:33 ] |
| Заглавие: | Re: Програма на С++ |
Можете ли да напишете програмата, не се сещам как ще стане, 5.5=25 (автоморфно); 6.6=36 (автоморфно); 11.11=121 (това не е автоморфно, защото не завършва на 11); 15.15=225 (това също не е, защото не завършва на 15). За броя на числата няма ограничение. |
|
| Автор: | morfei [ 15 Ное 2009, 12:43 ] |
| Заглавие: | Re: Програма на С++ |
Не съм се объркал! Затова съм написал МОЖЕ, а не СА. Тоест има смисъл да се проверяват само такива числа. Ти си ме разбрал, че всички, които завърват на тези цифра СА. Сега след малко размишления отхвърлям числата завършващи на 1(освен 1, защото е автоморфно). Колкото за N задължително трябва да има ограничение. По този начин човек се ориентира какъв тип да използва, колко да оптимизира алгоритъма и т.н. |
|
| Автор: | RadoRado [ 15 Ное 2009, 12:47 ] |
| Заглавие: | Re: Програма на С++ |
Ето малко по-дълго решение, за да е по-ясно. Код: #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; } |
|
| Автор: | morfei [ 15 Ное 2009, 12:50 ] |
| Заглавие: | Re: Програма на С++ |
Не си разбрал правилно задачата. Трябва да се изведат първите N на брой автоморфни числа, а не да се провери дали 1 число е автоморфно. |
|
| Автор: | RadoRado [ 15 Ное 2009, 13:08 ] |
| Заглавие: | Re: Програма на С++ |
Аз задачата я разбрах Код: #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; } |
|
| Автор: | morfei [ 15 Ное 2009, 13:23 ] |
| Заглавие: | Re: Програма на С++ |
Тази програма извежда автоморфните числа в даден интервал. Върви за N<=8. Нека човека да даде ограничението за N и ще видим до колко ще трябва да се оптимизира. |
|
| Автор: | morfei [ 15 Ное 2009, 13:43 ] |
| Заглавие: | Re: Програма на С++ |
Ето едно решение, което е значително по-бързо, но пак повтарям - всичко зависи от N. Ако N е повече от 20 трябва да се потърси по-хитър алгоритъм. Ако някой иска обяснение само да каже. Код: #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; } |
|
| Автор: | morfei [ 15 Ное 2009, 13:58 ] |
| Заглавие: | Re: Програма на С++ |
Една малка оптимизацийка: да се замени следния ред: Код: unsigned long long r=a,t = a*a; със Код: unsigned long long r = a/10,t = a*a/10; По принцип изглежда незначителна, но всъщност не е поради големия брой изпълнения на оператора присвояване и деление. |
|
| Автор: | RadoRado [ 15 Ное 2009, 14:37 ] |
| Заглавие: | Re: Програма на С++ |
Чак сега прочетох условието както трябва ;Д, pardon me. ето обосновка и бързо решение : http://en.wikipedia.org/wiki/Automorphic_number |
|
| Автор: | Йовков [ 21 Ное 2009, 09:57 ] |
| Заглавие: | Re: Програма на С++ |
morfei написа: Ето едно решение, което е значително по-бързо, но пак повтарям - всичко зависи от N. Ако N е повече от 20 трябва да се потърси по-хитър алгоритъм. Ако някой иска обяснение само да каже. Код: #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++ дава съобщение за две грешки, |
|
| Автор: | bggashnik [ 21 Ное 2009, 14:00 ] |
| Заглавие: | Re: Програма на С++ |
Компилира ми го, да! И аз съм с Дев. Мисля, че някъде в нета върлуваше един бъгав Дев, изтегли си друг |
|
| Автор: | morfei [ 21 Ное 2009, 14:12 ] |
| Заглавие: | Re: Програма на С++ |
Ако не ми се компилираше нямаше да ти дам кода. Изтегли го от тук: http://sourceforge.net/projects/dev-cpp ... e/download |
|
| Автор: | Йовков [ 12 Дек 2009, 10:20 ] |
| Заглавие: | Re: Програма на С++ |
Да се напише програма, която проверява дали на нечетните позиции в един масив стоят нечетни числа. Бихте ли написали програмата, за да сверя с това, което аз измислих? Все още ми е малко трудно програмирането на С++, |
|
| Страница 1 от 3 | Часовете са според зоната UTC + 2 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|