понеділок, 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;
}

Немає коментарів:

Дописати коментар