• Задача 4. Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       double a;
       cin>>a;
       if(a<0)cout<<-a<<endl;
       else cout<<a<<endl;
       return 0;
    }
    

    Задача 5. За да се реши задачата, трябва да проверим дали символът е цифра. Тъй като всички цифри са с последователни ASCII кодове, то можем да проверим дали цифрата се намира в интервала от символа ‘0’ до символа ‘9’.

    Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       char s;
       cin>>s;
       if(s>=’0’&&s<=’9’) cout<<”Yes”<<endl;
       else cout<<”No”<<endl;
       return 0;
    }
    

    Задача 6. Цифрите на въведеното число се отделят и се събират. Прави се проверка дали получената сума е четно число.

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

    Следните две решения реализират тези идеи.

    Решение 1: Като се използва целочислена променлива

    #include<iostream>
    using namespace std;
    int main()
    {
       int ch,sum=0;
       cin>>ch;
       sum+=ch/100;
       sum+=ch/10%10;
       sum+=ch%10;
       if(sum%2==0)cout<<”Yes”<<endl;
       else cout<<”No”<<endl;
       return 0;
    }
    

    Решение 2: Като се използва символна променлива

    #include<iostream>
    using namespace std;
    int main()
    {
       char s;
       int sum=0;
       cin>>s;//Въвежда цифрата на стотиците
       sum+=s-’0’;
       cin>>s;//Въвежда цифрата на десетиците
       sum+=s-’0’;
       cin>>s;//Въвежда цифрата на единиците
       sum+=s-’0’;
       if(sum%2==0)cout<<”Yes”<<endl;
       else cout<<”No”<<endl;
       return 0;
    }
    

    Задача 7. Последователността на отделяне на цифрите на едно число не е строго фиксирана. В следното решение отделенето на цифрите започва от цифрата на единиците.

    Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       int ch,pr=1;
       cin>>ch;
       pr*=ch%10;
       pr*=ch/10%10;
       pr*=ch/100%10;
       pr*=ch/1000;
       if(pr%3==0)cout<<”Yes”<<endl;
       else cout<<”No”<<endl;
       return 0;
    }
    

    Задача 8. За решението на задачата е необходимо да се извърши проверка за едновременното равенство на първата с последната и втората с третата цифри.

    Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       unsigned int ch;
       cin>>ch;
       if((ch%10==ch/1000)&&(ch/10%10==ch/100%10))
    	cout<<”Yes”<<endl;
       else
    	cout<<”No”<<endl;
       return 0;
    }
    

    Задача 9. Решение:

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
       double x;
       cin>>x;
       if(x>=20)cout<<”y=”<<(2*pow(x,4)+3)<<endl;
       else cout<<”y=”<<fabs(x-1)<<endl;
       return 0;
    }
    

    Задача 10. Решение:

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
       double x;
       cin>>x;
       if(x<-4) cout<<”y=”<<(2*x+1)<<endl;
       else
          if(x<=5) cout<<”y=”<<sqrt(x*x+3)<<endl;
          else cout<<”y=”<<x/(2*x+1);
       return 0;
    }
    

    Задача 11. Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       double x,y,max,min;
       cin>>x>>y;
       max=x;
       min=y;
       if(x<y)
       {
    	max=y;
    	min=x;
       }
       if(x<0)cout<<max<<endl;
       else cout<<min<<endl;
       return 0;
    }
    

    Задача 12. В решението на задачата трите цифри се отделят в различни променливи. Кратността на всяка цифра се проверява в разширено логическо условие.

    Решение 1:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n,c1,c2,c3;
       cin>>n;
       c1=n/100;
       c2=n/10%10;
       c3=n%10;
       if(n%c1==0&&n%c2==0&&n%c3==0)
          cout<<”Yes ”<<c1+c2+c3<<endl;
       else cout<<”No ”<<c1*c2*c3<<endl;
       return 0;
    }
    

    Задачата може да се реши и по втори начин. Всяка цифра се отделя в сложното булево условие на оператор if. При такова условие, в случай че първата част не е вярна, останалите части на условието не се проверяват. По този начин се повишава бързодействието на алгоритъма.

    Решение 2:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n;
       cin>>n;
       if(n%(n%10)==0&& n%(n/10%10)==0&& n%(n/100)==0)
    	cout<<”Yes ”<<(n%10+n/10%10+n/100)<<endl;
       else
    	cout<<”No ”<<((n%10)*(n/10%10)*(n/100))<<endl;
       return 0;
    }
    

    Задача 13. При тази задача е удобно цифрите на числото да се съхранят в отделни променливи поради двукратната им употреба.

    Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n,k,c1,c2,c3;
       cin>>n>>k;
       c1=n%10;
       c2=n/10%10;
       c3=n/100;
       if((c1+c2+c3)%k==0)cout<<”Yes ”<<c1<<c2<<c3<<endl;
       else cout<<”No ”<<(c1+c2+c3)*k<<endl;
       return 0;
    }
    

    Задача 14. Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n,c1,c2,c3;
       cin>>n;
       c1=n%10;
       c2=n/10%10;
       c3=n/100;
       if((c1+c2+c3)>=10) cout<<”Yes ”<<(c1+c2+c3)<<endl;
       else cout<<”No ”<<(c1*c2*c3)<<endl;
       return 0;
    }
    

    Задача 15. Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n,c1,c2,c3,k;
       cin>>n>>k;
       c1=n%10;
       c2=n/10%10;
       c3=n/100;
       if((c1*c2*c3)>k) cout<<”Yes ”<<(c1*c2*c3)+k<<endl;
       else cout<<”No ”<<k-(c1*c2*c3)<<endl;
       return 0;
    }
    

    Задача 16. Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n,m,c1,c2,c3;
       cin>>n>>m;
       c1=n/100+m%10;
       c2=n/10%10+m/10%10;
       c3=n%10+m/100;
       if(c1>9) c1=c1/10+c1%10;
       if(c2>9) c2=c2/10+c2%10;
       if(c3>9) c3=c3/10+c3%10;
       cout<<c1<<c2<<c3<<endl;
       return 0;
    }
    

    Задача 17. За да съществува триъгълник с дадените три страни, е необходимо страните му да са положителни числа и сборът на всеки две от тях да е по-голям от третата страна. Всъщност второто условие – сборът на всеки две страни да е по-голям от третата страна, изключва необходимостта от задаване на другото условие. Защо? Направете математически анализ.

    Решение:

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
       double a,b,c,p;
       cin>>a>>b>>c;
       if(a>=b+c||b>=a+c||c>=a+b)
       cout<<”не съществува”<<endl;
       else
       {
          p=(a+b+c)/2;
          cout<<sqrt(p*(p-a)*(p-b)*(p-c))<<endl;
       }
       return 0;
    }
    

    Задача 18. Задачата е аналогична на предходната с изключение на това, че се изискват допълнителни проверки за равенства между страните.

    Решение:

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
       double a,b,c,p;
       cin>>a>>b>>c;
       if(a>=b+c||b>=a+c||c>=a+b)
       cout<<”не съществува”<<endl;
       else
       {
    	 cout<<”съществува”<<endl;
    	 if(a==b&&a==c&&b==c)  
                   cout<<”равностранен”<<endl;
    	else
                  if(a==b||a==c||b==c)
                        cout<<”равнобедрен”<<endl;
                  else
                         cout<<”разностранен”<<endl;
       }
       return 0;
    }
    

    Задача 19. Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n,c1,c2,c3;
       cin>>n;
       c1=n%10;
       c2=n/10%10;
       c3=n/100;
       if((c1*c2*c3)>99)
    	 cout<<”yes ”<<((c1*c2*c3)-(c1+c2+c3))<<endl;
       else
    	 cout<<”no ”<<(c1*c2*c3)<<endl;
       return 0;
    }
    

    Задача 20. Решение:

    #include<iostream>
    using namespace std;
    int main()
    {
       int n,c1,c2,c3;
       cin>>n;
       c1=n%10;
       c2=n/10%10;
       c3=n/100;
       if(c1!=c2&&c2!=c3&&c1!=c3)
       cout<<”yes ”<<(c1*c3)<<endl;
       else
    	 cout<<”no ”<<c1<<c2<<c3<<endl;
       return 0;
    }
    

    Задача 21.

    Решение 1:

    #include<iostream>
    using namespace std;
    int main()
    {
      long int n1,n2,n3,min=2147483647,max=-2147483648;
      cin>>n1>>n2>>n3;
      // Намиране на min
      if(n1%2!=0&&min>n1) min=n1;
      if(n2%2!=0&&min>n2) min=n2;
      if(n3%2!=0&&min>n3) min=n3;
      // Намиране на max
      if(n1%2==0&&max<n1) max=n1;
      if(n2%2==0&&max<n2) max=n2;
      if(n3%2==0&&max<n3) max=n3;
      // Проверка дали всичките числа са нечетни
      if(n1%2!=0&&n2%2!=0&&n3%2!=0) cout<<min<<endl;
      else
         // Проверка дали всичките числа са четни
        if(n1%2==0&&n2%2==0&&n3%2==0) cout<<max<<endl;
        else
          // Остава числата да са и четни, и нечетни
         cout<<max-min<<endl;
        return 0;
    }
    

    При операцията остатък от целочислено деление полученият резултат носи знака на делимото. Ако делим положително число, остатъкът също е положителен, а при отрицателните – отрицателен. В следващото решение условията за нечетно число илюстрират това.

    Решение 2:

    #include<iostream>
    using namespace std;
    int main()
    {
      long int n1,n2,n3,min=2147483647,max=-2147483648;
      cin>>n1>>n2>>n3;
      // Намиране на min
      if((n1%2==1||n1%2==-1)&&min>n1) min=n1;
      if((n2%2==1||n2%2==-1)&&min>n2) min=n2;
      if((n3%2==1||n3%2==-1)&&min>n3) min=n3;
      // Намиране на max
      if(n1%2==0&&max<n1) max=n1;
      if(n2%2==0&&max<n2) max=n2;
      if(n3%2==0&&max<n3) max=n3;
      // Проверка дали всичките числа са нечетни
      if((n1%2==1||n1%2==-1)&&(n2%2==1||n2%2==-1)&&(n3%2==1||n3%2==-1))
         cout<<min<<endl;
      else
    	    // Проверка дали всичките числа са четни
         if(n1%2==0&&n2%2==0&&n3%2==0)
            cout<<max<<endl;
         else
    		// Остава числата да са и четни, и нечетни
            cout<<max-min<<endl;
       return 0;
    }
    
  • Вашият коментар

    Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *