Задача 7.
Решение a):
#include<iostream> using namespace std; int main() { unsigned int n,sum=0; cin>>n; for(int i=1;i<=n;i++) sum+=i; cout<<sum<<endl; return 0; }
Решение б):
#include<iostream> using namespace std; int main() { unsigned int n,fact=1; cin>>n; for(int i=1;i<=n;i++) fact*=i; cout<<fact<<endl; return 0; }
Задача 8. Решение:
#include<iostream> using namespace std; int main() { unsigned int n,step=1; cin>>n>>a; for(int i=1;i<=n;i++) step*=a; cout<<step<<endl; return 0; }
Задача 9. Най-лесно задачата може да се реши, като се формират и обходят последователно всички трицифрени числа, при което се намира сумата от цифрите им и се сравнява с числото k. Aко има равенство, разглежданото число се извежда на монитора.
Решение:
#include<iostream> using namespace std; int main() { unsigned short int k,sum; cin>>k; for(int i=100;i<1000;i++) { sum=i%10; sum+=i/10%10; sum+=i/100; /* Числата се извеждат последователно на няколко реда, понеже се очаква да бъдат много и да не се поберат на един екран, ако всяко от тях се извежда на нов ред */ if(sum==k) cout<<i<<' '; } return 0; }
Задача 10. Задачата може да бъде решена по два начина:
Решение 1: Последователно се разглежда всяко число от интервала [m,n] и ако то е кратно на 5, се извежда на монитора.
#include<iostream> using namespace std; int main() { int m,n; cin>>m>>n; for(int i=m;i<=n;i++) if(i%5==0) cout<<i<<' '; return 0; }
Решение 2: Намира се число а, което е първото число от интервала [m,n], кратно на 5. След което се използва цикъл, започващ от а и завършващ до края на интервала – n. Стъпката на цикъла се изменя през 5 и в тялото на цикъла се извежда стойността на управляващата променлива.
#include<iostream> using namespace std; int main() { int m,n,a; cin>>m>>n; if(m%5==0)a=m; else a=m+(5-m%5); for(int i=a;i<=n;i+=5) cout<<i<<' '; return 0; }
Задача 11. Задачата може да се реши най-лесно, като се направи непосредствена проверка за всяко трицифрено число.
Решение
#include<iostream> using namespace std; int main() { for(int i=100;i<1000;i++) if((i%10)!=0&&i%(i%10)==0) if((i/10%10)!=0&&i%(i/10%10)==0) if((i/100)!=0&&i%(i/100)==0)cout<<i<<' '; return 0; }
Обърнете внимание, че при проверките като първи аргумент на оператора && задаваме израз, който проверява дали цифрата е нула, а вторият аргумент е самото деление. При оператор логическо “и”, ако стойността на първия аргумент е 0, то вторият не се изчислява. Поради тази причина компилаторът няма да изведе съобщение за невалидна операция (деление на 0).
Задача 12. Отново чрез непосредствена проверка на всички четирицифрени числа ще бъдат открити тези, които отговарят на зададеното условие.
Решение:
#include<iostream> using namespace std; int main() { int sum; for(int i=1000;i<10000;i++) { sum=i%10; sum+=i/10%10; sum+=i/100%10; sum+=i/1000; if(sum%2==0&&sum>9) cout<<i<<' '; } return 0; }
Задача 13. Друг метод за формиране на всички четирицифрени числа е следният: с помощта на четири цикъла се образуват всички комбинации от цифри, които могат да съставят възможните записи на четирицифрените числа.
Решение:
#include<iostream> using namespace std; int main() { for(int a=1;a<=9;a++) for(int b=0;b<=9;b++) for(int c=0;c<=9;c++) for(int d=0;d<=9;d++) if(a==b||a==c||a==d||b==c||b==d||c==d) cout<<a<<b<<c<<d<<' '; return 0; }
Задача 14. Максималният сбор на цифрите на трицифрено число е 27. (Защо?). Затова може последователно да се сравни този сбор с всички прости числа в интервала [2,27].
Решение:
#include<iostream> using namespace std; int main() { int sum; for(int i=100;i<1000;i++) { sum=i%10; sum+=i/10%10; sum+=i/100; switch(sum) { case 2 : case 3 : case 5 : case 7 : case 11: case 13: case 17: case 19: case 23: cout<<i<<' '; break; } } return 0; }
Задача 15. За да се реши задачата, е необходимо да се провери дали всеки въведен символ е малка латинска буква. ASCII-кодовете на малките латински букви са разположени последователно в кодовата таблица и спазват наредбата в азбуката. Лесно може да се провери чрез сравнение дали даден символ е в интервала [a-z].
Решение:
#include<iostream> using namespace std; int main() { unsigned int n,br=0; char c; cin>>n; for(int i=0;i<n;i++) { cin>>c; if(c>='a'&&c<='z') br++; } cout<<br<<endl; return 0; }
Задача 16. Решение:
#include<iostream> using namespace std; int main() { unsigned int k,n,chislo,br_c,br=0; cin>>k>>n; for(int i=0;i<n;i++) { br_c=0; cin>>chislo; while(chislo) { br_c++; chislo/=10; } if(br_c==k)br++; } cout<<br<<endl; return 0;
Задача 17. Решение:
#include<iostream> using namespace std; int main() { unsigned int chislo,sum=0,br=0; cin>>chislo; while(chislo) { if(chislo%2==0)sum+=chislo; else br++; cin>>chislo; } cout<<sum<<" "<<br<<endl; return 0; }
Задача 18. Особенност при решението на тази задача е инициализирането на променливата max, в която ще се запази най-голямото четно число. Тъй като по условие ще се въвеждат само положителнни числа, max се инициализира със минимална стойност 0. В края на програмата се прави проверка дали max е 0 или различна от 0. Така става ясно дали са били въведени нечетни числа.
Решение:
#include<iostream> using namespace std; int main() { int chislo,max=0; cin>>chislo; while(chislo) { if(chislo%2==1&&max<chislo)max=chislo; cin>>chislo; } if(max)cout<<max<<endl; else cout<<"Не сте въвели нечетни числа"<<endl; return 0; }
Задача 19. В условието на задачата не е конкретизирано кой край на отсечката се задава като първи (дали този, намиращ се по-близо до началото на числовата ос, или по-далечният). Нека променливите a1 и a2 служат за въвеждане на двойката числа, указващи краищата на отсечката. За да се намери дължината на отсечката, при всяка двойка числа, от по-голямото число се изважда по-малкото и се помни в променлива а. Спрямо намерената дължина се прилага алгоритъм за намиране на максимална или минимална стойност.
Решение 1:
#include<iostream> using namespace std; int main() { unsigned short int а,a1,a2,max=0,min=100,n; cin>>n; for(int i=0;i<n;i++) { cin>>a1>>a2; if(a1>a2)a=a1-a2; else a=a2-a1; if(max<a) max=a; if(min>a) min=a; } cout<<max<<" "<<min<<endl; return 0; }
Решение 2: Решението може да се опрости, като за изчисляване дължината на отсечката се приложи функцията abs.
#include<iostream> #include<cmath> using namespace std; int main() { unsigned short int а,a1,a2,max=0,min=100,n; cin>>n; for(int i=0;i<n;i++) { cin>>a1>>a2; a=abs(a1-a2); if(max<a) max=a; if(min>a) min=a; } cout<<max<<" "<<min<<endl; return 0; }
Задача 20. Първото въведено число се съхранява в променлива k. Последователно в цикъл се въвеждат останалите числа, като всяко от тях се сравнява с k. Ако числото е равно на k, предварително декларирана и нулирана флагова променлива получава стойност 1. След проверката в тялото на цикъла k получава стойността на токущо въведеното число.
Решение:
#include<iostream> using namespace std; int main() { int n,k,chislo,flag=0; cin>>n; cin>>k; for(int i=1;i<n;i++) { cin>>chislo; if(chislo==k)flag=1; k=chislo; } if(flag)cout<<"Yes"<<endl; else cout<<"No"<<endl; return 0; }
Задача 21. Цифрите на числото се отделят последователно в цикъл и за всяка от тях се прави проверка дали е четна. Ако е четна, променлива брояч се увеличава. Тъй като входните данни могат да бъдат доста големи числа, е необходимо да се избере long int за тип на променливите.
Решение:
#include<iostream> using namespace std; int main() { long int n,br=0; cin>>n; while(n) { if((n%10)%2==0) br++; n/=10; } cout<<br<<endl; return 0; }
Ако числото няма в записа си четни цифри, изведената стойност ще бъде нула.
Задача 22. За да се получи двоичният код на едно число, трябва да се изпълни следният алгоритъм:
1) Докато числото има цифри, се намира остатъкът при целочислено деленеие на 2 и се прибавя към променлива брояч.
2) Числото n получава нова стойност, която е частното при целочисленото му деление на 2.
3) Този процес продължава, докато частното при деление на 2 стане 0.
Защо не е зададен въпросът дали остатъкът при целочисленото деление на 2 е единица?
Решение:
#include<iostream> using namespace std; int main() { long int n,br=0; cin>>n; while(n) { br+=n%2; n/=2; } cout<<br<<endl; return 0; }
Задача 23. Дадената задача изисква да се отдели всяка цифра на числото, да се натрупва в сума и да се проверява дали е максимална. Тук началната стойност на max може да бъде 0, защото това е най-малката цифра.
Решение:
#include<iostream> using namespace std; int main() { long int n,sum=0,max=0; cin>>n; while(n) { sum+=n%10; if(max<n%10) max=n%10; n/=10; } cout<<sum<<' '<<max<<endl; return 0; }
Задача 24. В тази задача трябва да се намерят сумата и броят на цифрите. Средноаритметичната стойност е частното на сумата с броя на цифрите.
Решение:
#include<iostream> using namespace std; int main() { long int n,sum=0,br=0; cin>>n; while(n) { sum+=n%10; br++; n/=10; } cout<<(double)sum/br<<endl; return 0; }
Задача 25. В зад.22 е показано как се намират цифрите от двоичния код на дадено число. Тъй като тези цифри в процеса на отделянето им се получават в обратен ред, е необходимо кодът да се запомни в променливата bin и да се извършат математически действия, така че двоичният код да бъде изведен коректно.
Решение:
#include<iostream> using namespace std; int main() { int n; long bin=0,pow10=1; cin>>n; while(n) { //Отделяне на поредната цифра на двоичния код bin+=n%2*pow10; pow10*=10; n/=2; } cout<<bin<<endl; return 0; }
Задача 26. Решение:
#include<iostream> using namespace std; int main() { int a1=1,a2=1,an,n,i=3; cin>>n; an=0; while (i<=n) { if(n==1||n==2){an=1;break;} an=a1+a2; a1=a2; a2=an; i++; } cout<<an<<endl; return 0; }
Задача 27. Решение:
#include<iostream> using namespace std; int main() { int n,f1=1,f2=1; cin>>n; while(f2<=n) { f2+=f1; f1=f2-f1; } cout<<f2<<endl; return 0; }
Задача 28. Всяко естествено число се дели на едно и на себе си. Тогава останалите делители се търсят в интервала от числото 2 до половината на даденото число. Защо?
Решение:
#include<iostream> using namespace std; int main() { int p; cin>>p; cout<<1<<' '; for (int i=2;i<=p/2;i++) if((p%i)==0) cout<<i<<" "; cout<<p<<endl; return 0; }
Задача 29. Едно число е просто, ако се дели само на 1 и на себе си. Прости могат да бъдат само естествени числа, по определение числото 1 не епросто. Тогава ако едно число има делител в интервала от 2 до половината на числото, то не е просто. Достъчно е намирането само на един делител, за да се направи извод, че числото не е просто. При извеждането на намерените прости числа е поставено условието да се извеждат само тези от числата в интервала [p,q], които са по-големи от 1.
Решение:
#include<iostream> using namespace std; int main() { int p,q,flag,del; cin>>p>>q; for(int i=p;i<=q;i++) { flag=1; for(del=2;del<=i/2;del++) if(i%del==0) {flag=0; break;} /*ако flag не е променен, числото няма делител и е просто*/ if(flag&&i>1) cout<<i<<' '; } return 0; }
Задача 30.
За решението на задачата е необходимо да се намерят простите делители на дадено число. След намиране на делител числото да се актуализира, като се раздели на този делител. Важно е да се отбележи, че е възможно дадено просто число да е многократен делител. Затова се прави проверка в допълнителен (вътрешен) цикъл. Изчерпвайки многократното повторение на даден делител, се отстранява възможността да има делители, които са съставни.
Решение 1:
#include<iostream> using namespace std; int main() { unsigned int p,k; cin>>p; k=p; cout<<p<<"="; /*Делителите на числото р могат да бъдат от 2 до половината на р*/ for(int i=2;i<=k/2;i++) { // Проверка дали числото р има прости делители while(p%i==0) { if(p==k)cout<<i; else cout<<"*"<<i; p/=i; } } //Ако самото число р е просто if(p==k)cout<<p<<endl; else cout<<endl; return 0; }
По-рационално решение може да се направи, като се използва само един цикъл.
Решение 2:
#include<iostream> using namespace std; int main() { int p,i=2; cin>>p; cout<<p<<"="; if (p==1) cout<<1; do if (p%i==0) { p/=i; if (p==1) cout<<i; else cout<<i<<'*'; } else i++; while(p>1); cout<<endl; return 0; }
Задача 31. Решение:
#include<iostream> using namespace std; int main() { int m,n,chislo,c,chislo1,flag,br=0; cin>>m>>n; for(int i=m;i<=n;i++) { flag=1; chislo=i; while(chislo) { c=chislo%10; chislo1=chislo/10; while(chislo1) { if(chislo1%10==c) { flag=0; break; } chislo1/=10; } if(flag==0)break; chislo/=10; } if(flag)br++; } cout<<br<<endl; return 0; }