Да се напише програма, която извежда:
- всички числа, кратни на X, които са по-малки от Y
- всички степени на X, които са по-малки от Y
Да се напише програма, която извежда:
[c] за С++ програми [/c]
[pascal] за паскал [/pascal]

за Къде се намира точка
за Вмъкване и изтриване на елемент *
за Позицията на X




за Броят на максималните елементи




за Броят на максималните елементи
за Пари за закуска




за Ученици с дадена оценка




за По-големи от средното| П | В | С | Ч | П | С | Н |
|---|---|---|---|---|---|---|
| « февр. | ||||||
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 | ||||||
//Poduslovie 1 int X,Y,chislo; cout<<"Vuvedete chisloto X(izvejda vsichki chisla kratni na nego): "; cin>>X; chislo=X; cout<<"Vuvedete chisloto Y(izvejda vsichki kratni na X po-malki ot nego): "; cin>>Y; cout<<"nnVsichki chisla, kratni na "<<X<<" sa: "; while(chislo<Y){ cout<<chislo<<" "; chislo+=X; } cout<<"/n/n";#include <math.h> //Poduslovie 2 int X,Y,stepen=0; cout<<"Vuvedete chisloto X(izvejda vsichki chisla stepeni na nego): "; cin>>X; cout<<"Vuvedete chisloto Y(izvejda vsichki stepeni na X po-malki ot nego): "; cin>>Y; cout<<"nnChislata koito sa stepeni na X i po-malki ot Y sa: "; while(pow(X,stepen)<Y){ cout<<stepen<<" "; stepen++; } cout<<"nn";Да, това е единия вариант. Има и още един…
#include <cstdlib> #include <iostream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { int chislo,lim,stp=1; cout<<"Wuwedeto nachalnoto chislo i granica "; cin>>chislo>>lim; if (((chislo==1)||(chislo==-1))&&(chislo<lim)) cout<<"Wsichki chisla i stepeni ot "<<chislo<<" do "<<lim<<" sa kratni/rawni na 1.\n"; else if (chislo<lim) { cout<<"Kratni "<<char(9)<<char(9)<<"Stepeni\n"; //char(9) ? ????????? for (int osnowa=abs(chislo);chislo<=lim;stp++) { cout<<chislo; chislo+=osnowa; if (pow(osnowa,stp)<lim) cout<<char(9)<<char(9)<<pow(osnowa,stp)<<" - "<<stp; cout<<endl; } } else cout<<"Newalidni danni (weroqtno wuwedenoto chislo e po-golqmo ot granicata)\n"; system("PAUSE"); return EXIT_SUCCESS; }Ха, сетил си се и че числото може да е отрицателно, и че ако е 1 програмата ще продължава до безкрай! Браво! Не съм и помислил, че и в тази задача може да има специфични случаи :-) Но сега, като се замисля, трябва да обработиш и число=0, защото и там ще продължава до безкрай.
За смятането на степените има по-оптимален вариант, писах го горе и на Ники. Помислете как от една степен се получава следващата…
#include <cstdlib> #include <iostream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { int chislo,lim,stp=1; cout<<"Wuwedeto nachalnoto chislo i granica "; cin>>chislo>>lim; if (!cin.good()) cout<<"Tezi 'chisla' ne mi hareswat :)\n"; else if (chislo==0) cout<<"Nqma kak da stane :) (ne delim na nula)\n"; else if (((chislo==1)||(chislo==-1))&&(chislo<lim)) cout<<"Wsichki chisla i stepeni ot "<<chislo<<" do "<<lim<<" sa kratni/rawni na 1.\n"; else if (chislo<lim) { cout<<"Kratni "<<char(9)<<char(9)<<"Stepeni\n"; //char(9) ? ????????? for (int osnowa=abs(chislo);chislo<=lim;stp++) { cout<<chislo; chislo+=osnowa; if (pow(osnowa,stp)<lim) cout<<char(9)<<char(9)<<pow(osnowa,stp)<<" - "<<stp; cout<<endl; } } else cout<<"Newalidni danni (wuwedenoto chislo e po-golqmo ot granicata)\n"; system("PAUSE"); return EXIT_SUCCESS; }Освен проверка за нула съм забравил и проверка дали границата е валидна (в предишното решение ако се въведе нещо различно от число получаваме странни резултати ). Е, вече го има, но не разбирам как ако умножаме числото по себе си ще ми помогне в моето решение. Така както го виждам в момента означава да въведа още една променлива, тъй като „osnowa“ я използвам за кратните числа. Може би някъде пропускам нещо.
Проверките за не-числа ми се виждат малко прекалени. За реална програма може да имат смисъл, но за учебна само усложняват кода. Хубаво е, че си видял в Интернет как става все пак. Виж, другите проверки са си съвсем на място.
А като умножаваме число по себе си печелим от това, че операцията умножение е по-„лека“ от степенуване. Тъй както и за кратните печелим ако събираме, а не умножаваме. Пробвай с всички степени на 3 до да кажем два милиона по двата начина и сравни времето за изпълнение.
Ясно, ще го имам предвид. Предполагам разликата във времето за изпълнение идва от там, че pow(a,b) е фунцкия и отнема повече време за изпълнение, защото се повиква, изчислява се и се връща резултат.
По-скоро от това, че при степен имаме няколко умножения. Всъщност, не съм го тествал, но предполагам, че ще е по-бавно :-) Калояне, и така както го бяхте направили е супер – просто исках да покажа и другия начин. Когато всичко направено е перфектно, обсъждаме незначителни детайли :-)
Ето го и другия вариант с по-голямо бързодействие
//Poduslovie 2 int X,Y,X1,stepen=0; cout<<"Vuvedete chisloto X(izvejda vsichki chisla stepeni na nego): "; cin>>X; cout<<"Vuvedete chisloto Y(izvejda vsichki stepeni na X po-malki ot nego): "; cin>>Y; //Zapomnqme X v nachaloto X1=X; if((X!=0)&&(X!=1)){ cout<<"\n\nChislata koito sa stepeni na X i po-malki ot Y sa: "; while(X<Y){ cout<<stepen<<" "; if(stepen==0) X*=1; else X*=X1; stepen++; } cout<<"\n\n"; } else cout<<"V sila sa vsichki stepenni pokazateli!"<<"\n\n";Ето едно решение и от мен, базирано на твоето:
#include <iostream> using namespace std; int main(int argc, char **argv) { int X,Y,X1; cout<<"Chisloto: "; cin>>X; cout<<"Gornata granica: "; cin>>Y; cout<<"Stepenite: "; if((X>1)||((X>=-1)&&(Y<X))){ X1=X; while(X<Y) { cout<<X<<" "; X*=X1; } if(X==X1) cout<<"niama takiva"; } else cout<<"vsichki do bezkrai!"; cout<<endl; return 0; }Като се замислих, задачата не е лесна – при X 0, 1, и -1 може в зависимост от Y или да нямаме решение, или да имаме безкрайно много. Ако X отрицателно число, но различно от горните, пак имаме безкрайно много решения, защото всички нечетни степени ще са пак отрицателни числа и ще растат надолу до безкрай и все ще са под Y.
Виж ти нещо привидно просто колко проблеми може да създаде :-)