Една от общоприетите формати за изписване на дата има вида: dd.mm.gggg, където dd е номера на деня, mm е номера на месеца и gggg е годината. За невалидна дата приемаме датата, в която е зададен само грешен номер на ден. Напишете програма VALID, която по зададена дата от 2008 година извежда Yes, ако датата е валидна дата и следващата я дата. Ако зададената дата не е валидна, програмата да извежда No и броя дни в зададения месец.
Примерен вход
Трите стойности d, m и g се въвеждат от клавиатура като цели числа. За решението на задачата се използва съответствието между номера и броя на дните в месеца, т.е. броя на дните в месеците с номер 1, 3, 5, 7, 8, 10, 12 е 31, като проверяшаме условието за виведен греяен номер на деня.
Аналогично и за месеците съответно с номера 4, 6, 9 и 11.
Тъй като става дума за определена година 2008, която е високосна, то въведен грешен номер на деня, когато месеца е 2, е този, който е по-голям от 29.
else{
cout<<”Yes\n”;
if(d==31 && m!=12) cout<<”1.”<
if(d==31 && m==12) cout<<”1.1.2009\n”;
if(d<31) cout<
}}
if(m==4 || m==6 || m==9 || m==11)
{
if(d>30)
cout << “No\n30”<else{
cout<<”Yes\n”;
if(d==30) cout<<”1.”<
if(d<30) cout<
}}
if(m==2)
{
if(d>29)
cout << “No\n29”<else{
cout<<”Yes\n”;
if(d==29) cout<<”1.”<
if(d<29) cout<
}}
return 0;
}
Задача 10: Дата
Младият програмист Росенчо се готвил за есенния турнир по информатика в гр. Шумен и бил освободен от училище. Един ден негов приятел му звъннал по телефона и му съобщил, че една седмица след завръщането му от турнира ще имат контролна. Росенчо започнал да прeсмята на коя дата точно е контролната му и съвсем се объркал. Помогнете му като съставите програма DATA.EXE, която въвежда от стандартния вход дата включваща ден, месец и година, разделени с по един интервал. На един ред на стандартния изход трябва да се изведе датата след седем дни, като деня, месеца и годината са разделени с тирета (-). Не забравяйте, че една година е високосна, ако се дели на 4, но не се дели на 100 или ако се дели на 400!
Примерен вход
12 11 2006
Примерен изход
19-11-2006
Примерен вход
28 02 2004
Примерен изход
6-3-2004
Примерен вход
31 12 2006
Примерен изход
7-1-2007
Решение:
Нека входът се записва в три променливи: d – ден, m – месец, g – година. Прибавяме към d 7 и ако получената стойност е по-голяма от дните в месеца (m), от променливата d изваждаме дните на въведения месец и прибавяме единица към месеца (m). Ако месецът е по-голям от 12, то следващият месец трябва да е януари (т.е. на променливата m присвояваме 1) и годината увеличаваме с единица. Когато въведената дата е през февруари трябва да се прави проверка дали годината е високосна. Както знаем, една година g е високосна, когато се дели на 4 без остатък, като специално правило се прилага, когато последните две цифри на g са нули. Тогава допълнителното условие годината g да е високосна е да се дели на 400 без остатък. Това се изразява чрез следното съставно логическо условие:
(((g%4==0)&&(g%100!=0))||(g%400==0))
Намерените d, m, g извеждаме разделени с тире.
#include
int main()
{
int d,m,g;
cin>>d>>m>>g;
d=d+7;
if ((m==1)||(m==3)||(m==5)||(m==7)
||(m==8)||(m==10)||(m==12))
if (d>31)
{
d=d-31;
m=m+1;
}
if ((m==4)||(m==6)||(m==9)||(m==11))
if (d>30)
{
d=d-30;
m=m+1;
}
if (m==2)
if ((((g%4)==0)&&((g%100)!=0)) ||((g%400)==0))
{
if (d>29)
{
d=d-29;
m=m+1;
}
}
else {
if (d>28)
{
d=d-28;
m=m+1;
}
}
if (m>12)
{
m=1;
g=g+1;
}
cout<
return 0;
}
ІIІ ниво. На този етап учениците са усвоили операторите за цикъл и вече имат възможност да обработват неопределен брой последователно въведени елементи.
Задача 11: Сума
Да се състави програма, която въвежда от клавиатурата числа до въвеждане на 0 и отпечатва сумата им
Примерен вход
3 18 30 5 0
Примерен изход
56
Решение:
Очевидно, тук ще се наложи многократно повторение на описаните в решението на предишната задача оператори:
cin>>а;
s+=а;
Освен това в условието на задачата е казано ясно до кога трябва да се извършат тези повторения: докато се въведе числото 0.
Като имаме предвид, че използваните променливи остават същите – програмата, която решава тази задача има следния вид:
//sum.cpp
#include
void main()
{
int a,s=0;
do
{
cin>>а;
s+=а;
}
while(a);
cout<
}
Тук do-while осигурява цикличното повторение на двата оператора:
cin>>а;
s+=а;
докато променливата а е различна от 0.
Задача 12: Брой
Да се състави програма COUNT.CPP, която въвежда числа от клавиатурата до въвеждане на нула и отпечатва броя на числата(без нулата).
Примерен вход
1 12 14 25 3 1 6 7 0
Примерен изход
8
Решение:
За да успеем да решим задачата трябва да си изясним двата основни момента:
- Какво се повтаря? – по аналогия с предходната задача лесно съобразяваме, че ще се повтарят двете действия: въвеждане на числото а и преброяването му. Самото преброяване ще осъществим, като при прочитане на всяко число, увеличаваме с 1 една целочислената променлива br (Много важно е да съобразим, че в началото на програмата на тази променлива трябва да се присвои стойност 0). След този анализ е ясно, че тялото на оператора за цикъл се състои от следните два оператора:
cin>>a;
br++;
- До кога се повтаря? – тук израза, определящ до кога ще се изпълнява тялото на цикъла, е зададен явно в условието на задачата, т. е. тялото на цикъла ще се повтаря докато въвежданото число е различно от 0. По-точно казано, в качеството на израз можем да използваме самата променлива а, чрез която се въвеждат числа от клавиатурата. Ако тя е ненулева, тялото на цикъла ще продължи да се изпълнява. В момента, в който се въведе 0, програмата ще продължи със следващия оператор, а следвайки условието, той трябва да извежда броя на въведените числа br.
След тези уточнения, получаваме като решение на задачата следната програма:
//count.cpp
#include
void main()
{
int a,br=0;
do
{
cin>>a;
br++;
}
while (a);
cout<<”br=”<
}
При тестване на програмата се оказва, че броят на числата е с 1 по-голям от действителния, т.е. програмата е преброила и числото 0. Ако решим, че числото 0 не трябва да бъде преброявано, трябва да помислим за промяна в решението, с която ще избегнем този проблем. Очевидно е, че в случаи, когато въведеното число е 0, брояча не трябва да бъде увеличаван. Ето защо заменяме реда в програмата br++; с реда if (a) br++;.
//count1.cpp
#include
void main()
{
int a, br=0;
do
{
cin>>a;
if(a)br++;
}
while (a);
cout<<”br=”<
}
Задача 13: Да се състави програма MULT.CPP, която чете от клавиатурата цели числа, до въвеждане на числото 1, и отпечатва произведението им.
Примерен вход
3
-1
9
126
1
Примерен изход
-3402
Примерен вход
-13
2
0
1
Примерен изход
0
Решение:
От условието на задачата е видно, че при решението и ще трябва да реализараме повторение, т.е. както и до сега трябва да си отговорим на следните въпроси:
- Какви величини са необходими за работата на програмата?
int a;//тази целочислена променлива ще използваме за последователното въвеждане на всяко едно от числата
long Р=1;//в рази променлива ще натрупваме произведението на числата.
Присвояваме и първоначална стойност 1, за да можем да умножаваме досегашната стойност на Р с поредното въведено число. Променливата е от тип long, защото произведението винаги е много по-голямо от числата, които умножаваме и може бързо да излезе извън границите на тип int.
- Какво се повтаря?
По аналогия с предходните задача лесно се съобразява, че ще се повтарят две действия:
cin>>a;
Р*=а;
- До кога се повтаря?
Тук израза, определящ до кога ще се изпълнява цикъла, е зададен явно в условието на задачата, т. е. тялото на цикъла ще се повтаря, докато въвежданото число е различно от 1. В момента, в който се въведе 1, програмата ще продължи със следващия оператор в програмата. Условието за край на цикъла ще изглежда така:
(а!=1)
- Остава да уточним кой от двата познати ни оператора за цикъл ще използваме?
От условието е ясно, че от клавиатурата задължително трябва да се въведе поне едно число и с него трябва да се умножи произведението Р. При това не се налага допълнителна обработка на първото въведено число. Следователно всяко едно от числата ще се обработва по един и същи начин, т.е. в тялото на цикъла, което задължително трябва да се изпълни поне веднъж. Цикълът, който удовлетворява тези изисквания е do-while.
Да върна ли задачата в цикъл while и в студентското съм направила същия бъркоч?
След тези уточнения можем да напишем решението на задачата (кода на програмата).
//mult.cpp
#include
void main()
{
int a;
long P=1;
do
{
cin>>a;
P*=a;
}
while(a!=1);
cout<
}
Задача 14: Да се състави програма NEGATIV.CPP, която чете от клавиатурата цели числа до въвеждане на отрицателно число и отпечатва броя на въведените четни числа.(Ще приемем, че 0 не е четно число).
Примерен вход
3
13
24
55
0
46
-8
Примерен изход
2
Упътване:
- Какви величини са необходими за работата на програмата?
int a; // за последователното въвеждане на всяко едно от числата
int br=0; //за броя на четните числа
- Какво се повтаря?
cin>>a; //въвежда се поредното число
if(a&&a%2==0)br++; //ако въведеното число се дели на 2 без остатък и не е 0, се увелечава броя на четните числа.
Забележете, че в израза не са употребени скоби, тъй като приоритета на операциите определя правилния ред на действията, т. е. първо се извършва проверката дали стойността на а не е 0 и после се проверява дали остатъка при деление на 2 е 0. Операциите за сравнение са с по-голям приоритет от логическите операции.
- До кога се повтаря?
Докато (а>=0).
Задача 15: Нечетни
Да се състави програма NEGATIVES.CPP, която въвежда от клавиатурата цели числа до въвеждане на 0 и отпечатва броя на въведените отрицателни числа.
Примерен вход
1
-3
7
-2
-6
0
Примерен изход
3
Решение:
-
Ще определим величините, които участват в програмата:
Необходими са ни две целочислени променливи: едната – int a;, за да записваме в нея текущо въведеното число и друга – за броя на нечетните числа. Да отбележим, че променливата, съдържаща броя на нечетните числа трябва предварително да се нулира: int br=0;
-
Последователното въвеждане на числа е свързано с повторение на определени действия и затова да уточним двете характеристики на повторението:
Повтарят се две действия: въвеждане на поредното число и проверка дали то е отрицателно. В случай, че числото е отрицателно, брояча се увеличава с 1. Тези действия се записват на С++ по следния начин:
cin>>a;
if(a<0)br++;
В условието на задачата точно е указан признака за повторение: описаните действия се повтарят докато въведеното число а е различно от 0.
-
Остава да уточним какъв цикъл ще използваме за реализация на повторенията.
-
Тъй като в условието за край на повторенията участва стойността на променливата а, то е добре тя да получи стойност преди проверката на това условие. От друга страна, условието на задачата предполага, че ще трябва да се въведе поне едно число. Ето защо е правилно в случая да използваме операторът do-while.
-
Накрая програмата трябва да изведе броя на отрицателните числа.
Сега можем да напишем текста на програмата:
//negative.cpp
#include
void main()
{
int a,br=0;
do
{
cin>>а;
if(a<0)br++;
}
while(a);
cout<
}
Задача 16: Сума К
Да се състави програма SUMK.CPP, която прочита от клавиатурата цяло число К и след него последователност от числа, докато сумата им стане по-голяма или равна на К и отпечатва броя на въведените числа.
Примерен вход
10
2
4
5
Примерен изход
3
Решение:
-
Необходими величини:
int K; - за първото въведено число
int a; - за текущото число от последователността
int br=0; - за броя на въведените числа. Като всеки брояч, и този трябва да се нулира.
int S=0; - за сумата на числата.
-
Въвежда се променливата K:
cin>>К;
-
Организира се цикъл, в който се повтаря:
cin>>a; //прочита се текущото число
br++; //увеличава се броя на въведените числа
S+=a; //добавя се прочетеното число към сумата
докато получената сума не е станала по-голяма или равна на К, т.е. докото S
-
Извежда се броя на въведените числа:
cout<
Както и преди, ще използваме цикъл do-while.
Окончателно програмата има следния вид:
//sumk.cpp
#include
void main()
{
int a,br=0,k;
cin>>k;
do
{
cin>>а;
br++;
S+=a;
}
while(S cout<
}
Задача 17: Викторина
За училищна викторина трябвало да се съставят отбори от по трима души, но участниците в тях трябвало да се сработват добре, за да има успех всеки отбор. За да се подберат правилно отборите всички участници били анкетирани, като резултатите от анкетата били записани с цели числа [0, 255]. Въпросите от анкетата били зададени така, че от резултата се разбира лесно дали един отбор е добре подбран. А това е така, ако сумата от резултатите на тримата участници в отбора е кратна на 3. Да се състави програма ANKETA.CPP, която чете от клавиатурата последователности от три числа (резултатите на тримата участници в отбора) до въвеждане на три нули и отпечатва след всяка от тях – OK, ако отбора е добре сформиран и Error, ако това не е така. За нулевата тройка не се отпечатва нищо.
Примерен вход
6 7 8
8 9 3
5 4 12
1 3 5
10 11 4
0 0 0
Примерен изход
OK
ERROR
OK
OK
ERROR
Решение:
За да определим дали даден отбор е добре сформиран, е необходимо да намерим сумата от точките на трите участника и да проверим дали се дели на три.
-
Необходими величини:
Тъй като е необходимо на всяка стъпка да обработваме резултатите и на тримата състезатели, ще са ни необходими три целочислени променливи a, b и c за всеки един от състезателите, както и променливата S за сумата от точките на тримата:
int a,b,c, S;
-
Веднага се организира цикъл do-while, в който на всяка стъпка се въвеждат трите числа a,b и c, пресмята се сумата им S и се проверява дали е кратна на 3. Условието за край може да бъде проверено най-лесно, като се вземе под внимание, че сумата на три цели, положителни числа (каквито са нашите) е 0 тогава и само тогава, когато и трите са 0.
do
{
cin>>а>>b>>c;
S=a+b+c;
if(S%3) cout<<”ERROR\n”;
else cout<<”OK\n”;
}
while (S);
Тези две стъпки всъщност решават задачата.
В този случай общия вид на програмата е следния:
//anketa.cpp
#include
void main()
{
int a,b,c,S;
do
{
cin>>а>>b>>c;
if(S=a+b+c)
if(S%3) cout<<”ERROR\n”;
else cout<<”OK\n”;
}
while (S);
}
Задача 18: Мравка
Миналото лято мравката Здравка попаднала на цяло находище от n трохи. Първата се намирала на 1 см от нейния мравуняк, втората – на 2 см, третата – на 3 см, четвъртата –на 4 см, …, n-тата – на n см. Здравка излизала от мравуняка, вземала по една троха, носела я в мравуняка и след това продължавала по същия начин до събирането на всички трохи. Напишете програма ant, която намира дължината на пътя, който Здравка е изминала, за да прибере всички трохи в мравуняка.
От стандартния вход на един ред се въвежда стойността на n (1 < n < 250). На един ред на стандартния изход програмата трябва да изведе дължината на изминатия от Здравка път в сантиметри.
Примерен вход
5
Примерен изход
30
Решение: Изминатият от мравката път е равен на удвоения сбор на естествените числа
от 1 до n.
#include
using namespace std;
int main()
{
int n, s = 0;
cin >> n;
for(int i=1; i<=n; i++)
s = s + i;
s = 2*s;
cout << s << endl;
return 0;
}
Задача 19: Сума от цифри на число
Дадено е трицифрено число к. Да се състави програма SUMCIF, която прочита от клавиатурата числото к и извежда на екрана сумата от цифрите му.
Пример:
Вход:
365
Изход:
14
Задача 20: Намиране на обратното число на дадено
Да се състави програма OBRATNO, която прочита от клавиатурата цяло, трицифрено число к и извежда на екрана обърнатото му.
Пример:
Вход:
365
Изход:
563
Решение:
За да намерим обърнатото на числото, трябва да намерим поотделно всяка една от цифрите му – цифрата на единиците, на десетиците и на стотиците.
-
Необходими величини:
-
освен цялото число к, се налага да заделим по едно цяло число за всяка една от цифрите:
int к,e,d,s,ок; //е – цифрата на единиците, d – на десетиците, s – на стотиците, ок - обърнатото на числото к.
-
Първо трябва да се въведе числото к:
cin>>k;
-
След това трябва да се изчислят съответните цифри, като използваме целочислените операции за деление по следния начин:
e=k%10;
d=k/10%10;
s=k/100%10;
-
Когато знаем цифрите на числото, можем да намерим обърнатото му по следната формула:
ок=100*е+10*d+s;
-
Накрая извеждаме намереното обърнато число.
Задача 21: Сума
Дадено е трицифрено число к. Да се напише програма SUMBACK, която намира огледалното число на к (числото, което се получава при прочитане на к от дясно на ляво) и извежда на екрана сумата на двете числа.
Пример:
Вход:
365
Изход:
938
Решение:
Можем да решим задачата, като е разделим на две под задачи – намиране на цифрите на число и получаване на число от няколко конретни цифри. Крайният резултат на решаваната задача е сумата на двете числа. Намирането на огледалното на даденото става по алгоринъма, описан в предходната задача.
Ето пълния текст на програмата:
//Sumback
#include
using namespace std;
int main()
{
int k,e,d,s,p;
cin>>k;
e=k%10;
d=k/10%10;
s=k/10/10%10;
p=100*e+10*d+s;
cout<
return 0;
}
Задача 22: Щастлива година
Една година е щастлива, ако има поне две еднакви цифри в записа си. Да се състави програма HAPPY, която прочита от клавиатурата дадена година n (цяло четирицифрено число) и отпечатва “YES”, ако тя е щастлива и “NO”, в противен случай.
Пример 1:
Вход:
2005
Изход:
YES
Пример 2:
Вход:
1970
Изход:
NО
Задача 23: Лунни числа
Дадено е четирифицрено число. Да се напише програма MOON, която определя дали числото е лунно и отпечатва “YES”, ако е такова и “NO” в противен случай. Едно число е лунно, ако сумата от цифрите на единиците и хилядните е равна на сумата от цифрите на десетиците и стотиците.
Пример 1:
Вход:
1728
Изход:
YES
Пример 2:
Вход:
2007
Изход:
NO
Задача 24: Сейф
(Национален есенен турнир по информатика, Шумен, 2004 г.)
Програмистът Гошо Тарикатски съхранява сорсовете на своите програми в специален сейф. За да го обезопаси срещу крадци решил да създаде сложно система за отключване. Тя се задействала от два различни пулта, от които се въвеждали две трицифрени числа. След като се въведат числата, се стартира програма, която генерира кода за сейфа по следния начин:
Събира първата цифра на първото число с последната цифра на второто число. Ако резултатът е двуцифрено число, цифрите му се събират. Получената цифра се записва като първа за кода.
Втората цифра се получава, като по същият начин се обработят вторите цифри на двете числа.
След сумирането на последната цифра на първото число и първата цифра на второто по посочената схема, се получава третата цифра на кода.
Гошо е много добър програмист, но е затрупан от поръчки, затова възлага на вас написването на програмата за получаване на кода.
Програмата се нарича KASA и получава от клавиатурата две трицифрени числа, след което извежда на екрана получения по горната схема код, който също е трицифрено число.
Пример:
Вход:
492 851
Изход:
551
Задача 25: Бонбонки
(Национален есенен турнир по информатика, Шумен, 2005 г.)
Умко (нашият познайник от училище “Програмистите на България”) имал странно хоби. Той имал четири кристални купички, в които грижливо събирал шоколадови бонбонки. Странното било това, че той не обичал да си похапва от тях, а само да си ги гледа разпределени по равен брой в своите купички. Във всяка от тях той държал по 10 бонбонки. Това че нашето умно момче не обичало шоколадовите бонбонки съвсем не означавало, че и неговата сестра не обичала да си похапва сладко, сладко от тях. Тя само изчаквала Умко да отиде на училище и с оргомно удоволствие си похапвала. Така всеки ден след като се връщал от училище, той виждал, че любимите му кристални купички вече не са пълни с по 10 бонбонки във всяка и тичал до магазина за да набави неоходимите бонбонки. След известно време Умко сменил тактиката. Вместо всеки ден да ходи до магазина и да си купува бонбонки, просто ги премествал от едната купичка в другата за да станат пак по равен брои в четирите купички. В случаите, когато това не било възможно, Умко все пак тичал до магазина.
Тъй като му омръзнало всеки път да пресмята колко бонбони трябва да размести и да купи, нашият приятел ви моли да напишeте програма BONBONKI, която прочита от клавиатурата последователно броя на бонбонките във всяка една от четирите купички и ако е възможно те да се разпределят по равно, извежда на екрана от коя купичка колко бонбонки се изваждат или добавят. Ако бонбонките се изваждат от купичката, пред броя им се поставя знака “-“, а ако те се добавят – знака “+”. Ако броя на бонбонките в съответната купичка остава непроменен, се извежда числото 0 без знак. Ако не е възможно бонбонките да се разпределят по равно в четирите купички, програмата извежда на екрана само броя на бонбонките, които Умко трябва да купи от магазина, за да поправи разпределението им.
Пример 1:
Вход:
2 3 4 5
Изход:
2
Пример 2:
Вход:
4 9 8 7
Изход:
+3 -2 -1 0
Задача 26: Сума от делителите
Да се състави програма DIV.CPP, която прочита от клавиатурата цяло число n и отпечатва сумата от тези негови делители, които са различни от 1 и n.
Примерен вход
18
Примерен изход
14
Решение:
Числата, които могат да бъдат делители на n са тези, които принадлежат на интервала [2, n/2]. Това е очевидно, защото ако допуснем, че 2 е най-малкият възможен делител, то най-големият се получава като разделим числото на него.
-
Необходими са ни две целочислени променливи: едната int n; – за числото и другата long S=0; - за сумата от делителите му. Числото S е от тип long, за да може в него да се запише сумата от делителите на кое да е число от тип int.
-
Като начало да въведем числото n:
cin>>n;
-
Обхождат се всички евентуални делители и за всеки от тях се проверява дали наистина дели n. Ако това е така, той се добавя към сумата S:
for(int d=2;d<=n/2;d++)
if(n%d==0)S+=d;
-
Накрая се извежда S:
cout<Ето окончателния вид на програмата:
// div.cpp
#include
void main()
{
int n, S=0;
cin>>n;
for(int d=2;d<=n/2;d++)
if(n%d==0)S+=d;
cout<
}
Задача 27: Прости делители.
Да се състави програма DIVPR, която прочита от клавиатурата цяло положително число n и извежда всички негови прости делители, като след всеки прост делител, разделена с тире, извежда и неговата кратност.
Пример:
Вход:
24
Изход:
2-3
3-1
Задача 28: Прости множители
Дадени са две цели положителни числа a и b. Разглеждаме целите числа, които са между a и b(включително и a и b). Всяко от тези числа разлагаме на просто множители. Напишете програма PRIME, която въвежда стойностите на a и b (1и извежда общия брой на всичките участващи в разлаганията числа.
Пример:
Вход:
7 10
Изход:
8
Пояснение. Числата от 7 до 10 се разлагат на прости множители така: 7=7,8=2.2.2, 9=3.3,10=2.5. Общия брой на всичките прости множители е 8.
Задача 29: Линийки
Дадени са две еднакви непрозрачни измервателни линийки с дължина L милиметъра, с деления на всеки милиметър. По дължината на всяка линийка са пробити по няколко дупки, като дупките са на еднакви разстояние от долния ръб на линийките. Дупките започват от нулевото деление и след това са разположени така, че разстоянието между всеки две съседни дупки е равно на m милиметра за едната линийка и на n милиметра за другата. Считаме, че дупки са пробити и на крайните (отбелязващи 1 мм.) деления на линийките, ако там се пада да се пробие дупка, съгласно казаното по-горе. Напишете програма LIN, която въвежда от клавиатурата цели положителни числа m, n и l, (m<50,n<50,l<5001) и извежда на екрана броя на дупките на двете линийки, през които може да се гледа, след като двете линийки се поставят точно една над друга.
Задача 30: Библиотека
Първата задача на библиотекарката Книжка Книгова на новото и работно място не била от най–любимите и. Тя трябвало да подреди N книги на шкаф с много рафтове, така че след като някой поиска дадена книга да може да я намира за най – малко време. Ако подреди всичките N книги само на един рафт, времето необходимо за намирането, на коя да е книга ще е N секунди, а ако раздели книгите на K рафта, то времето, необходимо за намирането на книга от кой да е рафт ще е К + P секунди, където P е броя на книгите на съответния рафт (т.е. K секунди, за да намери рафта и още P секунди, за да намери търсената книга). Например, ако има 7 книги, Книжка може да сложи всички книги на един рафт и тогава ще и отнеме 7 секунди за да намери коя да е от тях. Ако тя раздели 7 книги на 2 рафта с по 3 и 4 книги всеки, то ще и отнеме първо 2 секунди за да намери правилния рафт и след това още 3 или 4 секунди за намиране на всяка една от книгите, но след като незнаем коя книга ще търсим общото време за търсене ще бъде 6 секунди. Помогнете на библиотекарката да разбере колко ще е минималното време, необходимо намиране на произволна книга.
Напишете програма MINITIME, която от стандартния вход чете едно цяло число N(1<=N<=107) – броя на книгите, които Книжка трябвало да подреди и отпечатва на стандартния изход едно число – минималното време, за което тя ще може да намери коя да е от книгите.
Пример 1:
Вход:
7
Изход:
6
Пример 2:
Вход:
3
Изход:
3
Задача 31: Монети
В една държава разполагат с монети от 2 и 5 пари. Да се състави програма MONETI, която по въведена сума S отпечатва всички възможни комбинации от монети, с които тя може да се представи. Ако тя не може да се представи с тези монети, отпечатва “NO”.
Пример 1:
Вход:
17
Изход:
1.2+3.5
6.2+1.5
Пример 2:
Вход:
3
Изход:
NO
Задача 32: Питагорови тройки
За всеки правоъгълен триъгълник е в сила равенството c2=a2+b2 (Теорема на Питагор), където a и b са катетите, а c е хипотенузата на триъгълника. Да се състави програма PITAGOR, която за дадено естествено число N намира и отпечатва всички тройки естествени числа a, b и c, не по-големи от N, които могат да бъдат страни на правоъгълен триъгълник.
Пример:
Вход:
11
Изход:
3 4 5
6 8 10
Задача 33: Банкноти
Разполагаме с В1 банкноти по 1лв, В2 – по 2лв и В5 – по 5лв. Да се състави програма MONEY, която въвежда от клавиатурата последователно броя на копюрите от всеки вид – B1, B2, B5 и сума Р и извежда на екрана всички възможни начини, по които може да се представи сумата Р лева с възможните банкноти.
Пример:
Вход:
3 5 2 18
Изход:
0 4 2
2 3 2
3 5 1
Задача 34: Разпределение на стаи
Група от N деца отива на почивка. В почивната станция разполагат със стаи с по 3 и 4 легла. Да се състави програма CHILDREN, която въвежда от клавиатурата броя на децата N и отпечатва броя на различните разпределения на децата по стаите. Ако такова разпределение е невъзможно, на екрана се извежда “NO”.
Пример:
Вход:
30
Изход
3
Задача 35: Лунни числа
Да се състaви програма MOON, която прочита две числа а и b(999 и отпечатва всички лунни числа в интервала от а до b. Едно число е лунно, ако сумата от цифрите на единиците и хилядните е равна на сумата от цифрите на десетиците и стотиците. Ако в зададения интервал няма лунни числа програмата трябва да отпечатва NO.
Пример 1:
Вход:
1000 1300
Изход:
1001 1111 1221
Пример 2:
Вход:
1223 1310
Изход:
NO
Задача 36: Автобусни линии
(Национална олимпиада по информатика’2005, Областен кръг, Група E (4–5 клас))
Коко живее в голям град и непрекъснато пътува с градски автобуси. Номерата на всички автобусни линии са трицифрени. Веднъж Коко с изненада установил, че номерата на някои линии имат особено свойство: като задраскаме поотделно всяка от цифрите, сумата на две от получените числа е равна на третото число. Напишете програма BUS, която прочита от клавиатурата две цели числа А и В и извежда на екрана всички числа по-големи или равни на А и по-малки или равни на В, които имат различни цифри и притежават зададеното по-горе свойство, като разполага всяко число на отделен ред.
Пример:
Вход:
105 200
Изход:
105
106
107
108
109
Задача 37: Състезание1
Да се състави програма COMPET1, която прочита от клавиатурата целочислените резултати на трима състезатели, участвали в едно лекоатлетическо състезание и отпечатва най-високия резултат.
Примерен вход:
4 7 5
Примерен изход:
7
Могат да се съставят множество задачи за определяне на оптимален от фиксиран брой елементи. Ето няколко примера:
Задача 38: Състезание2
В състезание по вдигане на тежести при равни резултати на по-предно място се класира по-лекия състезател. Да се състави програма COMPЕТ2, която прочита от клавиатурата резултатите и теглата на трима състезатели и отпечатва постижението и теглото на златния медалист.
Примерен вход:
180 67
180 66
170 70
Примерен изход:
180 66
Задача 39: Числа
Да се състави програма BIGNUM, която прочита от клавиатурата цяло трицифрено число К, и отпечатва най-голямото трицифрено число, което може да се получи от цифрите на К.
Примерен вход:
657
Сподели с приятели: