Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на строки и числа.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
1qsd
Здравствуйте. Помогите решить следующую задачу.

Записаны все степени числа 2^k (0<=k<=100). Переписать их в одну строку так, чтобы полученное число было наименьшим. Например:

k=5, число 11623248 (1 16 2 32 4 8)

k=10, число 10241128162256324512648 (1024 1 128 16 2 256 32 4 512 64 8)
volvo
Фактически задача сводится к сортировке полученных чисел - степеней двойки (только сортировать их надо НЕ как числа, а как строки)... После того, как массив таких строк будет отсортирован по возрастанию, достаточно выписать все его элементы подряд...
мисс_граффити
volvo,
 var s1,s2:string;
begin
s1:='1';
s2:='1024';
if s1<=s2 then writeln (s1,s2)
else writeln(s2,s1);
end.

не получается так...
надо вводить дополнительное условие: если одна строка входит в другую с начала...
volvo
Цитата
если одна строка входит в другую с начала...
Объясни мне тогда, как задать вот этот момент:
1024 < 1 < 128
?

Я, кстати, не написал, что надо сравнивать лексикографически... Над методом сортировки сейчас думаю...

Добавлено через 2 мин.
Кстати, есть еще один момент: 2100 - это в любом случае длинная арифметика...
мисс_граффити
Цитата
Объясни мне тогда, как задать вот этот момент

у меня получилось вот что....
program sort;
uses crt;
const n=15;
var s:array[1..n] of string;
vs: string;
i,j: integer;

function compare(s1,s2: string):boolean;
begin
if length(s1)>length(s2) then
compare:=not(compare(s2,s1))
else
begin
compare:=false;
if pos(s1,s2)<>1 then
begin
if s1>s2 then
compare:=true;
end
else
if s2[length(s1)+1]<s1[1] then
compare:=true;
end;
end;

begin
clrscr;
for i:=1 to n do
str(trunc((exp(ln(2)*(i-1)))),s[i]);
for i:=1 to n-1 do
for j:=1 to n-1 do
if compare(s[j],s[j+1]) then
begin
vs:=s[j];
s[j]:=s[j+1];
s[j+1]:=vs;
end;

for i:=1 to n do
write(s[i],' ');
end.

volvo
no1.gif Не пойдет... Смотри, что получается в твоей программе при n = 15:
1024 1 128 16 16384 2 2048 256 32 4096 4 512 64 8 8192
Тебе не кажется, что если поменять местами 2 <-> 2048 и 8 <-> 8192, то число будет меньше? wink.gif
мисс_граффити
сорри, недосортировывала....
исправила.
volvo
А вот мой вариант...
program sort;

function check(s1, s2: string): boolean;
begin
check := ((s1 + s2) > (s2 + s1))
end;

const n = 15;
var s : array[1..n] of string;
vs: string;
i,j: integer;
begin
for i:=1 to n do
str(trunc((exp(ln(2)*(i-1)))),s[i]);

for i := 1 to n do begin
for j := n downto i + 1 do
if check(s[pred(j)], s[j]) then begin
vs := s[pred(j)]; s[pred(j)] := s[j]; s[j] := vs;
end;
end;

for i:=1 to n do
write(s[i],' ');
writeln;
end.

volvo
А вот, если кому интересно, полная программа, включая генерацию всех степеней двойки при 1 <= N <= 100, безо всякой длинной арифметики...

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.