Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal ABC
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
Ww
2 / 2 / 3
Регистрация: 31.10.2012
Сообщений: 20
#1

Задача "Инопланетянин" - Pascal ABC

31.10.2012, 19:48. Просмотров 2495. Ответов 10
Метки нет (Все метки)

Во время эксперимента Накодиллы было случайно получено сообщение инопланетян , содержащее формулу вида A + B = C. Общественности стало интересно , какую же систему счисления использую инопланетяне. Так как внеземная цивилизация была достаточно развита, чтобы отправить межпланетное сообщение , Накодилла предположил, что основание системы счисления довольно мало. Требуется написать программу, которая находит минимальное основание системы счисления, при котором данное равенство выполняется.

ФОРМАТ ВВОДА : В единственной строке входных данных содержится три числа A , B и C. Числа состоят из цифр от 0 до 9 и заглавных латинских букв от A до Z.

ФОРМАТ ВЫВОДА : Требуется вывести единственное число - искомое основание системы счисления. Если такой системы счисления не существует , то вывести -1. Гарантируется, что ответ не превышает 36.

Пример ввода : 2 2 4 Пример вывода : 5

Пример ввода : 1A 2 20 Пример вывода : 12


___
http://www.cyberforum.ru/pascalabc/thread741017.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2012, 19:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задача "Инопланетянин" (Pascal ABC):

Даны текстовый файл "F" и строка "S". Получить все строки файла "F", содержащие в качестве фрагмента строку "S".
Плиз помогите написать прогу: Даны текстовый файл "F" и строка "S". Получить...

Пожалуйста, составьте программу, которая из слов"СТРАХ","БЕЛКА","ЦЫПЛЁНОК" получает слово "СТОЛБЕЦ"
Пожалуйста, составьте программу, которая из слов"СТРАХ","БЕЛКА","ЦЫПЛЁНОК"...

Удвоить в строке буквы "ю", "ъ", "ф", "э", а между словами оставить только по одному пробелу
Пользователь заполняет символьную строку русскими буквами. Буквы ю, ъ, ф, э в...

Изобразить стрелку и осуществить движение по клавишам "вверх", "вниз", "вправо", "влево"
Необходимо изобразить стрелку и осуществить движение по клавишам "вверх",...

Даны строки а="вариант",b= "Высоко", с = "макароны". Получить слово "соковарка"
4 .Даны строки а="вариант",b= "Высоко", с = "макароны". Получить слово...

10
SladkayaVata
271 / 187 / 173
Регистрация: 06.06.2012
Сообщений: 321
31.10.2012, 21:43 #2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const
  n = 36;
 
var
  a: array[1..n] of integer;
  i, k, p: integer;
  s: string;
  max: integer;
 
begin
  k := 0;
  for i := 48 to 57 do 
  begin
    k := k + 1;
    a[k] := i
  end;
  for i := 65 to 90 do 
  begin
    k := k + 1;
    a[k] := i;
  end;
  writeln('Введите строку символов');
  readln(s);
  max := 48;
  for i := 1 to length(s) do 
    if ord(s[i]) > max then max := ord(s[i]);
  for i := 1 to n do 
    if max = a[i] then p := i;
  if p <= 1 then writeln('Такого не существует') else
    writeln('Система счисления= ', p);
end.
У тебя в примере ввода - вывода ошибка... если есть A то - 11ричная система.
1
Dyaside
1 / 1 / 1
Регистрация: 25.10.2011
Сообщений: 14
31.10.2012, 22:07 #3
Решал не давно эту задачу по олимпиаде.
Вот решение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
var A: Array[1..3] of String;
    S: Array[1..3] of LongInt;
    C: Char;
    i,j,n: LongInt;
    ss: LongInt;
    
function CharToNum(C: Char): Integer;
begin
  if (C>='0') and (C<='9') then CharToNum:=ORD(c)-48
                   else CharToNum:=10+Ord(C)-65;
end;
    
begin
  ss:=1;
  A[1]:='';
  A[2]:='';
  A[3]:='';
  repeat
    Read(c);
    if CharToNum(C)>SS then ss:=CharToNum(C);
    if C<>' ' then A[1]:=A[1]+C;
  until c=' ';
  
  repeat
    Read(c);
    if CharToNum(C)>SS then ss:=CharToNum(C);
    if C<>' ' then A[2]:=A[2]+C;
  until c=' ';
  ReadLn(A[3]);
  for i:=1 to Length(A[3]) do
    if CharToNum(A[3][i])>SS then ss:=CharToNum(A[3][i]);
 
  for j:=ss+1 to 36 do begin
    for i:=1 to 3 do S[i]:=0;
    n:=1;
    for i:=Length(A[1]) downto 1 do begin      
      s[1]:=s[1]+CharToNum(A[1][i])*n;
      n:=n*j;
    end; 
    n:=1;
    for i:=Length(A[2]) downto 1 do begin      
      s[2]:=s[2]+CharToNum(A[2][i])*n;
      n:=n*j;
    end; 
    n:=1;
    for i:=Length(A[3]) downto 1 do begin      
      s[3]:=s[3]+CharToNum(A[3][i])*n;
      n:=n*j;
    end; 
    if s[1]+s[2]=s[3] then break;
  end;  
  if s[1]+s[2]=s[3] then WriteLn(j) else WriteLn(1);
end.
1
Ww
2 / 2 / 3
Регистрация: 31.10.2012
Сообщений: 20
31.10.2012, 23:02  [ТС] #4
Ни одна из программ не прошла всех 5-ти тестов!
Первая прошла 2, вторая - 4.
Не могли бы первую по строчкам разобрать...и вторую по возможности...
а именно:
Pascal
1
2
3
4
5
6
for i := 48 to 57 do 
  begin
    k := k + 1;
    a[k] := i
  end;
  for i := 65 to 90 do
что эти цифры то значат?
____
По буквенно разбирать не надо, только основное.

Добавлено через 7 минут
Всё понятно, вторая задача абсолютно правильна! Он должен, если системы счисления нет, вывести -1, а не 1.
короче
Pascal
1
else WriteLn(1)
поменять 1 на -1 и всё
__P.s
объяснения нужны.
0
SladkayaVata
271 / 187 / 173
Регистрация: 06.06.2012
Сообщений: 321
01.11.2012, 14:19 #5
Во-первых, за такую наглость, имею право послать куда подальше.
Во-вторых, эти цифры значат то, что я в массив заполняю всевозможные цифры [0..9] и латинские буквы [A..Z], которые могут быть использованы в системе счисления. И по ним уже проверяю.
Далее, каким образом, второй вариант решения может быть абсолютно верным?!
если когда вводишь строчные латинские буквы, ответ выводит больше 36. Хотя по условию задачи такого быть не может? И почему ввод реализован не строку а просто Char... уже условия задачи к чертям испорчены. В общем ты сам хоть понимаешь что требуется в задаче? Или ты просто скопировал код и отправил проверять на сайте, не прошли тесты и сразу сюда и требовать верное решение?! Сам изучи мой код. И прочитай про систему счислений. Гугл в помощь.
2
Ww
2 / 2 / 3
Регистрация: 31.10.2012
Сообщений: 20
01.11.2012, 15:33  [ТС] #6
От части вы правы.
скопировал, протестил и выдал....
но мне нужно не только правильно решить, но и понять еще!

Pascal
1
2
3
4
5
6
7
8
9
for i := 48 to 57 do 
  begin
    k := k + 1;
    a[k] := i
  end;
  for i := 65 to 90 do 
  begin
    k := k + 1;
    a[k] := i;
вот почему мы заполняем массив именно так??????
и что именно считает счётчик?
Pascal
1
2
k := k + 1;
    a[k] := i
0
SladkayaVata
271 / 187 / 173
Регистрация: 06.06.2012
Сообщений: 321
01.11.2012, 15:55 #7
Это счетчик номера элемента массива.
Т.к. i меняется от 48 до 57 то я не могу написать так:
Pascal
1
a[i]:=i;
Потому что это будет значить: a[48]:=48 и так до 57.
А у нас размерность массива - 1..36.
Так вот, этот счетчик и считает то что как раз нам нужно:
Pascal
1
2
3
4
5
a[k]:=i;
a[1]:=48; 
a[2]:=49;
..............
a[10]:=57;
Заметь, при этом k становится 10ью, после этого действия
Заполнив первую часть массива числами от 48 до 57
мы приступаем ко второй части т.е. к заглавным латинским буквам:
Т.к. мы k не обнуляли, то счетчик K будет продолжать накапливаться после заполнения первой части.
Т.е. мы начнем с k=11..
Pascal
1
2
3
4
5
a[k]:=i;
a[11]:=65;
a[12]:=66;
................
a[36]:=90;
k=36 (полная размерность массива)
И следовательно будет массив так:
48, 49, 50,...57, 65, 66,67 и так далее до 90. [Массив 1]
Почему эти цифры? потому что если мы используем функцию chr(x) от любого элемента этого первого массива, то получим массив из чисел и заглавных латинских букв.
0, 1, 2, 3,...9, A,B,C,...,Z
Pascal
1
(chr(48) = 0, chr(57)=9, chr(65) = A, chr(90)=Z)
Вот.
1
Ww
2 / 2 / 3
Регистрация: 31.10.2012
Сообщений: 20
01.11.2012, 22:32  [ТС] #8
Красава++++++
НАконец понятно откуда эти цифры...
Есть где таблица типо откуда их брать?(числа)на будущее чтобы знать
но все же ваша прога проходит лишь 2 теста из 5
и я пока не понял поч так...
а вторая та что более закрученная прокатывает...
буду думать вообщем... как доделать вашу.
0
SladkayaVata
271 / 187 / 173
Регистрация: 06.06.2012
Сообщений: 321
01.11.2012, 22:45 #9
Можно его из программы "вытащить"
Pascal
1
2
3
4
5
var i:integer;
begin
for i:=1 to 256 do
write(i,'= ',chr(i),' ');
end.
вывод: порядковый номер= и сам символ.
1
Magaragorn
2 / 2 / 3
Регистрация: 01.03.2012
Сообщений: 40
06.10.2013, 14:38 #10
Привет, я наверное поздно, но другим поможет.
Мой алгоритм таков: считываем в строку, переводим в 3 строки, находим мин основание системы счисления, и проверяем все системы счисления от найденного основания до 36.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var a,b,c,e,i,j,d,k:longint;
s,s1,s2,s3:string;
function per(C: Char): longint;
begin
  if (C>='0') and (C<='9') then per:=ORD(c)-48
                   else per:=10+Ord(C)-65;
end;
function step(a,b:longint):longint;
var v,i:longint;
begin
v:=a;
 
if b=0 then
step:=1 else
begin
for i:=1 to b-1 do
a:=a*v;
step:=a;
end;
end;
 
begin
readln(s);
for i:=1 to length(s) do
if per(s[i])>e then
e:=per(s[i]); /нашли мин. основание
for  i:=1  to  pos(' ',s)-1  do
s1:=s1+s[i];
delete(s,1,pos(' ',s));
for  i:=1  to  pos(' ',s)-1  do
s2:=s2+s[i];
delete(s,1,pos(' ',s));
for  i:=1  to  length(s)  do
s3:=s3+s[i]; /перевели в 3 строки
 
for i:=e+1 to 36 do
begin
for d:=1 to length(s1) do
a:=a+per(s1[d])*step(i,length(s1)-d);
for j:=1 to length(s2) do
b:=b+per(s2[j])*step(i,length(s2)-j);
for k:=1 to length(s3) do
c:=c+per(s3[k])*step(i,length(s3)-k); 
if a+b=c then /проверка
begin
 writeln(i);
 break;
end else
if i=36 then /если конец то ошибка
writeln(-1);
 a:=0; b:=0; c:=0;
end;
 
end.
0
анюта123
3 / 0 / 1
Регистрация: 16.09.2013
Сообщений: 8
06.10.2013, 14:41 #11
У тебя в примере ввода - вывода ошибка... если есть A то - 11ричная система.
0
06.10.2013, 14:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2013, 14:41
Привет! Вот еще темы с решениями:

Определить сколько "5", "4", "3", "2" было выставлено в каждом классе
известны оценки за контрольную по физике каждого ученика двух классов....

Заменить букву "А" на "КО" и подсчитать общее количество букв "Ф" и "В"
Заменить букву &quot;А&quot; на &quot;КО&quot; и подсчитать общее кол-во букв &quot;Ф&quot; и &quot;В&quot; . и ...

Ввести один из символов "Y" или "n". При вводе "Y" вывести на экран слово "Да", а при вводе "n" слово "нет"
1.Ввести один из символов &quot;Y&quot; или &quot;n&quot;. При вводе &quot;Y&quot; вывести на экран слово...

Подсчитать сколько раз в тексте встречаются буквы "л" и "а" стоящие отдельно.заменитьь все буквы "л" на "77"
Задача.Подсчитать сколько раз в тексте встречаются буквы &quot;л&quot; и &quot;а&quot; стоящие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru