(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=102)
Приклад.
Введення:
16
FFFF
Виведення:
65535
Задача. Дано число в системі числення з основою m (2≤m≤16). Написати програму що переводить дане число в систему числення з основою 10.
Технічні умови. Програма читає з клавіатури першому рядку число m (основу системи числення), а в другому - текстовий рядок, в якому записано саме число Ch (0≤Ch≤2+109). Програма виводить на екран відповідь у вигляді десяткового числа.
Приклад.
Введення:
16
FFFF
Виведення:
65535
Розв'язання.
Переведемо число FFFF з 16-вої системи числення в 10-ву:
FFFF16 = 15*163 + 15*162 + 15*161 + 15*160 = 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.
FFFF16 = 15*163 + 15*162 + 15*161 + 15*160 = 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.
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;
}
#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;
}
Немає коментарів:
Дописати коментар