Кратни и степени на X, по-малки от Y

Да се напише програма, която извежда:

  • всички числа, кратни на X, които са по-малки от Y
  • всички степени на X, които са по-малки от Y
Публикувано в 11а, 11в с етикети . Постоянна връзка.

11 коментара по Кратни и степени на X, по-малки от Y

  1. Gadget каза:
    //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";
    
  2. Gadget каза:
     
    #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";
    
  3. dreanor каза:
    #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, защото и там ще продължава до безкрай.

      За смятането на степените има по-оптимален вариант, писах го горе и на Ники. Помислете как от една степен се получава следващата…

  4. dreanor каза:
    #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 до да кажем два милиона по двата начина и сравни времето за изпълнение.

      • dreanor каза:

        Ясно, ще го имам предвид. Предполагам разликата във времето за изпълнение идва от там, че pow(a,b) е фунцкия и отнема повече време за изпълнение, защото се повиква, изчислява се и се връща резултат.

        • Данаил каза:

          По-скоро от това, че при степен имаме няколко умножения. Всъщност, не съм го тествал, но предполагам, че ще е по-бавно :-) Калояне, и така както го бяхте направили е супер – просто исках да покажа и другия начин. Когато всичко направено е перфектно, обсъждаме незначителни детайли :-)

  5. Gadget каза:

    Ето го и другия вариант с по-голямо бързодействие

     
    //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.

      Виж ти нещо привидно просто колко проблеми може да създаде :-)

Вашият коментар