Здравствуйте. Помогите решить следующую задачу.
Записаны все степени числа 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,
var s1,s2:string;
begin
s1:='1';
s2:='1024';
if s1<=s2 then writeln (s1,s2)
else writeln(s2,s1);
end.
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.
Не пойдет... Смотри, что получается в твоей программе при n = 15:
1024 1 128 16 16384 2 2048 256 32 4096 4 512 64 8 8192
сорри, недосортировывала....
исправила.
А вот мой вариант...
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.
А вот, если кому интересно, полная программа, включая генерацию всех степеней двойки при 1 <= N <= 100, безо всякой длинной арифметики...
Прикрепленные файлы
minimal.pas ( 1.01 килобайт )
Кол-во скачиваний: 288