середа, 18 березня 2015 р.

Buratino

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=118)

Задача. Буратіно має лише N золотих монет, які він отримав від Карабаса-Барабаса. Кіт та лисиця розповіли йому, що закопавши гроші на Полі чудес, за кожен урожай можна збирати їх у L разів більше. Для вирощування урожаю необхідно Т повних годин. Скільки монет зможе зібрати Буратіно у разі удачі за M годин (M>=T)? Ті монети, які він закопав – зникають. Кожен раз Буратіно закопує всі наявні монети.  

Технічні умови. Програма Buratino читає з клавітатури числа N, L, T, M одним рядком через пропуск. Програма виводить на екран єдине число число - шукану величину. Всі числа не більші 10000.  

Приклад. 
Введення: 10 2 5 10
Виведення: 40
Розв'язання.
Через кожні T годин кількість монет N збільшиться в L разів. Отже, через M годин кількість монет N збільшиться в L - M\T разів (\ - ділення націло). І буде дорівнювати: N*LM\T, де \ - ділення націло. 
Запишемо алгоритми мовами програмування.

Free Pascal:
Var N, L, T, M : Integer;
Begin
 Read (N, L, T, M);
 Write (N*Round(Exp((M div T)*Ln(L))));
End.

C++:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
 int n, l, t, m;
 cin >> n >> l >> t >> m;
 cout << n*pow((float)l,m/t);
}

вівторок, 17 березня 2015 р.

Petro

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=117)

Задача. Петрик П'яточкін хоче дістати яблуко, яке висить на висоті N (N>=1) метрів. Для цього йому потрібно зв'язати кілька жердин, довжини яких він знає. Таких жердин у нього М (М>=1), кожна має довжину Lі. Яку найменшу кількість жердин йому потрібно зв'язати щоб дістати яблуко? Вважати, що жердини монтуються стик в стик, тобто при зв'язуванні жодний сантиметр жодної жердини не втрачається.

Технічні умови. Програма Petro читає з клавіатури рядок чисел через пропуск: N, M, L1, L2, ..., LM. Програма виводить єдине число - шукану величину. Якщо яблуко дістати неможливо, програма повинна вивести 0.  

Приклади.
Введення: 10 5 1 3 4 3 6
Виведення: 2

Введення: 10 5 1 1 1 1 1
Виведення: 0
Розв'язання.
Після введення даних, будемо шукати найбільшу жердину (Lm) та її номер (Im) і додаватимемо її до зв'язаних жердин (Ld) доки останні не досягнуть потрібної висоти (N).
Запишемо алгоритми мовами програмування.

Free Pascal:
Var N, M, I, J,
    Ld, Lm, Im : Integer;
             L : Array [1..50] Of Integer;
Begin
 Read (N, M);
 For I := 1 To M Do
  Read (L[I]);
 Ld := 0;
 For I := 1 To M Do Begin
  Lm := L[I];
  Im := I;
  For J := I+1 To M Do
   If L[J] > Lm
    Then Begin
     Lm := L[J];
     Im := J;
    End;
  Ld += Lm;
  If Ld >= N
   Then Break;
  L[Im] := L[I];
 End;
 If Ld >= N
  Then Write (I)
  Else Write (0);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n, m, i;
 cin >> n >> m;
 int l[m-1], ld=0;
 for (i=0; i<m; i++)
  cin >> l[i];
 for (i=0; i<m; i++) {
  int lm=l[i], im=i;
  for (int j=i+1; j<m; j++)
   if (l[j]>lm)
    lm=l[j], im=j;
    ld+=lm;
    if (ld>=n) break;
    l[im]=l[i];
 }
 if (ld>=n)
  cout << i+1;
  else cout << 0;
}

понеділок, 16 березня 2015 р.

Multik

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=116)


Задача. Заєць із відомого мультфільму втікає від Вовка по сходах довжиною N сходинок. Для того, щоб втекти, Зайцю потрібно сховатись за дверима, які знаходяться на останній сходинці. Вовк не може схопити зайця, якщо вони одночасно не знаходяться на 1 сходинці, або якщо Вовк не випереджає Зайця. Заєць за 1 крок може піднятись на 1 сходинку, а Вовк – на 2. На початку бігу Вовк знаходиться на 0-й  сходинці, а  Заєць на К -ій (К >0 ) сходинці. Чи зможе Вовк схопити Зайця? Якщо Вовк і Заєць останнім кроком стають одночасно на останню сходинку, то Вовк схопить Зайця. Вовк та Заєць роблять кроки одночасно (синхронно).

Технічні умови. Програма Мultik читає з клавіатури числа N і K через пропуск. Програма виводить на екран 1, якщо Вовк поласував Зайцем або 0, якщо залишився голодним.  Всі розрахунки не виходять за межі типу іnteger Turbo Pascal.

Приклади.

Введення: 10 7
Виведення: 0

Введення: 10 5
Виведення: 1
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var N, K : Integer;
Begin
 Read (N, K);
 If N-K >= N/2
  Then Write ('1')
  Else Write ('0');
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n, k;
 cin >> n >> k;
 if (n-k >= n/2)
  cout << '1';
  else cout << '0';
}

пʼятниця, 13 березня 2015 р.

Puh

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=115)

Задача. Ведмедик Вінні-Пух тікає від бджіл по алеї, яка складається із товстих дерев, яких N (1<=N<=300). Кожне дерево має дупло певного діаметра D (D>=0). Якщо діаметр дупла більший за діаметр черевця Вінні-Пуха, то ведмедик може заховатись в цьому дуплі. Діаметр черевця Вінні-Пуха – V (V>0). У якому  першому за рахунком дереві він може заховатись? Скільки на алеї росте дерев, де може заховатись Вінні-Пух?

Технічні умови. Програма Puh читає з клавіатури послідовність цілих чисел одним рядком через пропуск: N, V, D1, D2 , ..., DN. Програма виводить на екран шукані велечини в указаній в умові послідовності. Якщо заховатися неможливо, програма виводить  0.

Приклади.

Введення: 10 5 1 0 4 8 10 2 0 1 9 0
Виведення: 1 4 3

Введення: 2 6 3 4
Виведення: 0
Розв'язання.
Будемо зчитувати діаметр чергового дерева та перевірятимемо чи може в ньому заховатися Вінні-Пух.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var N, V,
 D, I, K : Integer;
    Flag : Boolean;
Begin
 Read (N, V);
 K := 0;
 Flag := True;
 For I := 1 To N Do Begin
  Read (D);
  If V < D
   Then Begin
    If Flag
     Then Begin
      Write ('1 ', I, ' ');
      Flag := False;
     End;
    Inc (K);
   End;
 End;
 Write (K);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n, v, d, k=0;
 cin >> n >> v;
 bool f=true;
 for (int i=1; i<=n; i++) {
  cin >> d;
  if (v < d) {
   if (f) {
    cout << "1 " << i << ' ';
    f=false;
   }
   k++;
  }
 }
 cout << k;
}

четвер, 12 березня 2015 р.

Cat

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=114)

Задача. Одного разу кіт Леопольд на рибалці наловив N (1<= N <=100) риб. Прийшовши додому він ретельно їх зважив, пронумерував кожну рибу та записав результати до зошита. Допоможіть Леопольду знайти вагу найбільшої та найменшої рибини, та вагу всієї риби, яку зловив кіт. Вага рибини - ціле число, не більше 1000. Всі розрахунки не виходять за межі типу integer Turbo Pascal.

Технічні умови. Програма Cat читає з клавіатури кількість рибин, а далі вагу кожної рибини в порядку їх номерів. Всі числа в одному рядку через пропуск. Програма виводить на екран одним рядком через пропуск вагу найважчої та найлегшої рибини та сумарну вагу спійманих Леопольдом риб.  

Приклад.
Введення: 5 2 3 5 7 8
Виведення: 8 2 25
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var N, R, Max, Min, S : Integer;
Begin
 Read (N);
 S := 0;
 Min := 1000;
 Max := 1;
 For N := 1 To N Do Begin
  Read (R);
  If Min > R
   Then Min := R;
  If Max < R
   Then Max := R;
  S += R;
 End;
 Write (Max, ' ', Min, ' ', S);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n, r;
 cin >> n;
 int min=1000, max=1, s=0;
 for (int i=1; i<=n; i++) {
  cin >> r;
  if (r < min)
   min=r;
  if (r > max)
   max=r;
  s+=r;
 }
 cout << max<< ' '<< min<< ' '<< s;
}

середа, 11 березня 2015 р.

Salary

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=113)

Задача. Визначити, яку заробітну платню одержить на фірмі сумісник за виконану роботу, якщо йому нараховано S грн., а податок становить 20%.

Вхідні дані. Ви вводите з клавіатури одне дійсне число S.
Вихідні дані. Ви виводите на екран одне дійсне число з двома знаками після коми (без округлення).

Приклад вхідних і вихідних даних.
Введення: 1000
Виведення: 800.00
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var S : Real;
Begin
 Read (S);
 S := 0.8*S;
 Write (S:0:2);
End.

C++:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
 float s;
 cin >> s;
 cout.setf(ios::fixed);
 cout <<setprecision(2) << 0.8*s;
}

вівторок, 10 березня 2015 р.

Mirror

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=112)

Задача. У Несміяни кругле обличчя, радіус якого R см. Визначте, яку сторону повинно мати квадратне дзеркало, щоб, коли Несміяна милується собою, її відображення поміщалось у дзеркалі?

Вхідні дані. Ви вводите з клавіатури одне дійсне число R.
Вихідні дані. Ви виводите на екран одне дійсне число – сторону дзеркала. Результат містить 2 знаки після коми (без округлення).

Приклад вхідних і вихідних даних.
Введення: 7.6
Виведення: 15.20
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var R : Real;
Begin
 Read (R);
 R := 2*R;
 Write (R:0:2);
End.

C++:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
 float r;
 cin >> r;
 cout.setf(ios::fixed);
 cout <<setprecision(2) << 2*r;
}

пʼятниця, 6 березня 2015 р.

Heights

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=111)

Задача. Дано сторони трикутника а, b, с. Знайти висоти трикутника, радіуси вписаного та описаного кіл.

Вхідні дані. Ви вводите з клавіатури три дійсних числа а, b, с.
Вихідні дані. Ви виводите на екран п’ять дійсних чисел з трьома знаками після коми (без округлення).

Приклад вхідних і вихідних даних.
Введення: 23.000 34.000 43.000
Виведення: 33.813 22.873 18.086 21.619 7.777
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var a, b, c, p,
    Ha, Hb, Hc,
      S, r0, R : Real;
Begin
 Read (a, b, c);
 p := (a+b+c)/2;
 S := Sqrt (p*(p-a)*(p-b)*(p-c));
 Ha := 2*S/a;
 Hb := 2*S/b;
 Hc := 2*S/c;
 r0 := S/p;
 R := 0.25*a*b*c/S;
 Write (Ha:0:3, ' ', Hb:0:3, ' ', Hc:0:3, ' ', R:0:3, ' ', r0:0:3);
End.

C++:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
 double a, b, c;
 cin >>a >>b >>c;
 double p=(a+b+c)/2;
 double s=sqrt(p*(p-a)*(p-b)*(p-c));
 double ha=2*s/a, hb=2*s/b, hc=2*s/c;
 double R=0.25*a*b*c/s, r=s/p;
 cout.setf(ios::fixed);
 cout <<setprecision(3) <<ha <<' ' <<hb <<' ' <<hc <<' ' <<R <<' ' <<r;
}

четвер, 5 березня 2015 р.

Circle2

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=110) 

Задача. Дано довжину кола. Визначити площу круга, обмеженого цим колом.

Вхідні дані. Ви вводите з клавіатури одне дійсне число.
Вихідні дані. Ви виводите на екран одне дійсне число з трьома знаками після коми (без округлення).

Приклад вхідних і вихідних даних.
Введення: 12
Виведення: 11.459
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var L : Real;
Begin
 Read (L);
 L := Pi*Sqr(L/2/Pi);
 Write (L:0:3);
End.

C++:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
 double l;
 cin >> l;
 cout.setf(ios::fixed);
 cout << setprecision(3) << M_PI*pow(l/M_PI/2,2);
}

середа, 4 березня 2015 р.

Pupil

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=109)

Задача. Учень-невдаха Сашко сів виконувати домашнє завдання і просидів за столом 2 години. З них х хвилин він чухав потилицю і дивився у вікно, у шукав у письмовому столі гумку, щоб стерти у підручнику з англійської мови карикатуру на свого товариша, на малювання якої він витратив перед цим z хвилин. Решту часу Сашко перекладав англійські слова. Скільки слів він встиг перекласти, якщо переклад одного слова у нього займав 5 хвилин?
Примітка. Використовувати цілочисельне ділення (команду div).

Вхідні дані. Ви вводите з клавіатури три цілих числа x, y, z.
Вихідні дані. Ви виводите на екран одне число – шукану кількість слів.

Приклад вхідних і вихідних даних.
Введення: 10 15 25
Виведення: 14
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var X, Y, Z : Integer;
Begin
 Read (X, Y, Z);
 Write ((120-X-Y-Z) div 5);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int x, y, z ;
 cin >> x >> y >> z;
 cout << (120-x-y-z)/5;
}

вівторок, 3 березня 2015 р.

Girls

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=108)

Задача. Якщо на одну шальку терезів посадити Даринку, яка важить n кг, і Тетянку, яка важить на 5 кг більше, а на іншу насипати m кг цукерок, то скільки кілограм цукерок доведеться з’їсти дівчаткам, щоб шальки терезів врівноважились?

Вхідні дані. Ви вводите з клавіатури два цілих числа n і m.
Вихідні дані. Ви виводите на екран одне шукане число.

Приклад вхідних і вихідних даних.
Введення: 40 89
Виведення: 4
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var N, M : Integer;
Begin
 Read (N, M);
 Write (M-2*N-5);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n, m ;
 cin >> n >> m;
 cout << m-2*n-5;
}

понеділок, 2 березня 2015 р.

Cube

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=107)

Задача. Дано довжину ребра куба. Знайти його об’єм та площу всієї поверхні.

Вхідні дані. Ви вводите з клавіатури одне ціле число.
Вихідні дані. Ви виводите на екран два цілих числа – об’єм та площу поверхні куба.

Приклад вхідних і вихідних даних.
Введення: 4
Виведення: 64 96
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var A : Integer;
Begin
 Read (A);
 Write (A*A*A, ' ', 6*A*A);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int a;
 cin >> a;
 cout << a*a*a << ' ' << 6*a*a;
}

пʼятниця, 27 лютого 2015 р.

NewCircle

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=106)

Задача. Дано  послідовність  цілих чисел.  Відрізок послідовності утворюють числа, що йдуть в послідовності підряд в порядку зростання. Знайти номери чисел, якими починається і закінчується  перший відрізок з максимальною сумою, а також цю суму.  

Технічні умови. Програма читає спочатку кількість елементів послідовності, а потім саму цю послідовність. Всі числа в одному рядку, їх розділено пропусками. Гарантовано, що послідовність не порожня, і всі розрахунки можна вести в межах типу longint. Програма виводить  в один рядок 3 числа через пропуск - номера першого і останнього елемента шуканого відрізка і суму чисел відрізку. 

Приклади.

Введення 3 -2 -1 0
Виведення 3 3 0

Введення 5 1 2 -3 3 0
Виведення 1 2 3
Розв'язання.*
З послідовності (P[N]) будемо послідовно виділяти відрізки починаючи з 1-го елемента та знаходитемо їх суму (Vs), яку будемо порівнювати з максимальною (Ms) та зберігатимемо початок (Mb) і кінець (Me) відрізка з максимальною сумою.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var Mb, Me,
   N, I, J : 1..50;
    Ms, Vs : Integer;
         P : Array [1..50] Of Integer;
Begin
 Read (N);
 For I := 1 To N Do
  Read(P[I]);
 Mb := 1;
 Me := 1;
 Ms := P[1];
 For I :=1 To N Do Begin
  Vs := P[I];
  For J := I+1 To N+1 Do Begin
   If Vs > Ms
    Then Begin
     Mb := I;
     Me := J-1;
     Ms := Vs;
    End;
   If (P[J] > P[J-1]) And (J <= N)
    Then Vs += P[J]
    Else Break;
  End;
 End;
 Write(Mb, ' ', Me, ' ', Ms);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n;
 cin >> n;
 int p[n];
 for (int i=0; i<n; i++)
  cin >> p[i];
 int mb=0, me=0, ms=p[0];
 for (int i=0; i<n; i++){
  int vs=p[i];
  for (int j=i+1; j<n+1; j++){
   if (vs>ms){
    mb=i;
    me=j-1;
    ms=vs;
   };
   if ((p[j]>p[j-1])&&(j<n))
    vs+=p[j];
    else break;
  }
 }
 cout << mb+1 << ' ' << me+1 << ' ' << ms;
}

* Розв'язання, на мою думку вірне, але проходить 9 з 10 тестів.

четвер, 26 лютого 2015 р.

Brackets

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=105)

Задача. Дано алгебраїчний вираз з дужками, записаний одним рядком. Вірно чи не вірно в ньому розставлено дужки?

Технічні умови. Програма читає  з клавіатури рядок з виразом (не довший за 255 символів). Програма виводить на екран відповідь у вигляді текстового рядка. Якщо дужки розставлено вірно - друкує слово True, якщо не вірно - False.

Приклад.
Введення:
(a+b)
Виведення:
True
Розв'язання.
У виразі вірно розставлено дужки, якщо кількість відкритих дорівнює кількості закритих і закрита не зустрічається раніше за відкриту. Отже, резервуємо змінну К, яку будемо збільшувати на 1 при зустрічі '('  і відповідно зменшуватимемо при зустрічі ')', та слідкуватимемо щоб К не стало від'ємним (K<0 - ')' зустрічається раніше за '(').
Запишемо алгоритми мовами програмування.

Free Pascal:
Var R : String[255];
    K, I : Integer;
Begin
 Read (R);
 K := 0;
 For I :=1 To Length (R) Do Begin
  Case R[I] Of
   '(' : Inc (K);
   ')' : Dec (K);
  End;
  If K < 0
   Then Break;
 End;
 Write (K = 0);
End.

C++:*
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 char r[256];
 cin >> r;
 int k=0;
 for (int i=0; i<strlen(r); i++) {
  switch (r[i]) {
   case '(' : k++; break;
   case ')' : k--; break;
  }
  if (k<0) break;
 }
 std::cout << std::boolalpha;
 std::cout << (bool)!k;
}

* Розв'язання, на мою думку вірне, але не проходить жодного тесту....

середа, 25 лютого 2015 р.

Clock

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=104)

Задача. Стрілки годинника рухаються з постійним кутовими швидкостями   h  годин  m  хвилин. Найти  число повних хвилин до найближчого моменту, в  яких стрілки  співвпадуть.

Технічні умови. Програма читає два цілих числа  h  та  m  з клавіатури. Програма виводить.  ціле число  хвилин  на екран.

Приклади.

Введення: 0 0
Виведення: 0

Введення: 1 1
Виведення: 4
Розв'язання*.
Для розв'язування задачі скористаємося годинником ОС. Будемо по черзі від 0:00 до 12:00 співставляти стрілки годинника і записувати час. Отримаємо 11 співпадань, які розділять 12 годин на 12 проміжків. Так як нам потрібно знайти число повних хвилин, а також для зручності, переведемо ввведений час та часи співпадань у хвилини. Хвилини співпадань будемо зберігати в масиві, в який для замкнення кільця додамо 13-й елемент - 720 хвилин = 0:00. Отже, якщо введений час потраплятиме в один із проміжків, то різниця між кінцем інтервалу і введеним часом буде шуканою, інакше стрілки вже співпадають.
Запишемо алгоритми мовами програмування.

Free Pascal:
Const X : Array [0..11] Of 0..720 =
(0, 65, 130, 196, 261, 327, 392, 458, 523, 589, 654, 720); 
Var H, M, I : Integer;
Begin
 Read (H, M);
 M := (H mod 12)*60 + M;
 H := 0;
 For I := 1 To 11 Do
  If (X[I-1] < M) And (M < X[I])
    Then H := X[I] - M;
 Write (H);   
End.

C++:
#include <iostream>
using namespace std;
int main()
{
 const int x[] =
 {0, 65, 130, 196, 261, 327, 392, 458, 523, 589, 654, 720};
 int h, m;
 cin >> h >> m;
 m=(h%12)*60+m, h=0;
 for (int i=1; i<=11; i++)
  if ((x[i-1]<m)&&(m<x[i]))
   h=x[i]-m;
 cout << h;
}

* Розв'язання, хоча воно вірне, не дуже мені подобається...

вівторок, 24 лютого 2015 р.

Hex

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=103)

Задача. Дано число Ch  в десятковій системі числення.  Написати програму що переводить дане число в систему числення з основою m.

Технічні умови. Програма читає  з клавіатури в першому рядку число m (2≤m≤16), в другому - число Ch (0≤Ch≤2+109)  в десятковій системі.  Програма виводить на екран відповідь в вигляді текстового рядка.

Приклад.
Введення:
16
1024
Виведення:
400
Розв'язання
Задача обернена до попередньої (Nhex).
Щоб перевести число 1024 з 10-вої системи числення в 16-ву потрібно послідовно ділити 1024 та отримані частки на 16 доти, поки частка не стане меншою за 16. Остання частка і буде першою цифрою отриманого числа, залишки записані в зворотньому порядку - рештою чисел (перший залишок - остання цифра).
Переведемо:
3-тя цифра - 1024:16 = 64*16 + 0;
2-га цифра - 64:16 = 4*16 + 0;
1-ша цифра - 4<16, тому ділення завершено і 102410 = 40016.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var M, Z : 2..16;
         Ch : 0..2000000000;
           N : String[31];
Begin
 ReadLn (M);
 Read (Ch);
 N := '';
 Repeat
  Z := Ch mod M;
  Ch := Ch div M;
  If Z < 10
   Then N := Chr (48+Z) + N
   Else N := Chr (55+Z) + N;
 Until Ch = 0;
 Write(N);
End. 

C++:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 int m, ch, z;
 cin >> m >> ch;
 string n="";
 do
 {
 z=ch%m, ch/=m;
 char c=(z<10) ? (z+48) : (z+55);
 n=c+n;
 }
 while (ch!=0);
 cout << n;
}

понеділок, 23 лютого 2015 р.

Nhex

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=102)

Задача. Дано число  в системі числення з основою  m (2≤m≤16). Написати програму що переводить дане число в систему числення з основою 10.

Технічні умови. Програма читає  з клавіатури першому рядку  число  m (основу системи числення), а в другому - текстовий рядок, в якому записано саме число Ch (0≤Ch≤2+109). Програма виводить на екран відповідь у вигляді десяткового числа.

Приклад.
Введення:
16
FFFF
Виведення:
65535
Розв'язання.
Переведемо число FFFF з 16-вої системи числення в 10-ву:
FFFF16 = 15*16+ 15*16+ 15*16+ 15*16= 15*4096 + 15*256 + 15*16 + 15*1 = 61440 + 3840 + 240 + 15 = 65535.
Отже, потрібно знайти суму добутків цифр числа і відповідних розрядів. 
Для реалізаці алгоритму нам потрібні цифри введеного числа переведені з символьного типу в числовий:'0' - 0, ..., '9' - 9, 'A' - 10, ..., 'F' - 15.
Відповідно Ch[i], ..., Ch[3], Ch[2], Ch[1].
(Потрібно врахувати, що в Pascal символи рядкового типу нумеруються з 1, а в C++ - з 0.)
Для переведення будемо використовувати коди символів (коди є числами) врахувавши різницю між кодом і числом яке він позначає. Коди символів: '0'..'9' - 48..57, 'A'..'F' - 65..70. Переведену цифру будемо записувати в зміннну Z.
Наприклад:
Ch[i] = '8':  Z = код('8') - 48 = 56 - 48 = 8;
Ch[i] = 'D': Z = код('D') - 55 = 68 - 55 = 13.
Розряд: mi-1, ..., m2, m1, m0, будемо зберігати в змінній Rd.
Відповідно: Rd = 1; Rd = Rd*m = m1; Rd = Rd*m = m*m = m2; ...
Шукане число будемо зберігати в змінній N.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var M, Z : 2..16;
         Ch : String[31];
            I : Byte;
   N, Rd : LongInt;
Begin
 ReadLn (M);
 Read (Ch);
 N := 0;
 Rd := 1;
 For I:=Length(Ch) DownTo 1 Do Begin
  If Ch[I]<='9'
   Then Z := Ord(Ch[I])-48
   Else Z := Ord(Ch[I])-55;
  N += Z*Rd;
  Rd *= M;
 End; 
 Write(N);
End.

C++:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 int m, z;
 char ch[32];
 cin >> m >> ch;
 int n=0, rd=1;
 for (int i=strlen(ch)-1; i>=0; i--)
 {
 z=(ch[i]<='9') ? (ch[i]-48) : (ch[i]-55);
 rd*=(n+=z*rd, m);
 }
 cout << n;
}