IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на строки и числа.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Kost

Репутация: -  0  +


Здравствуйте. Помогите решить следующую задачу.

Записаны все степени числа 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)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Фактически задача сводится к сортировке полученных чисел - степеней двойки (только сортировать их надо НЕ как числа, а как строки)... После того, как массив таких строк будет отсортирован по возрастанию, достаточно выписать все его элементы подряд...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


volvo,
 var s1,s2:string;
begin
s1:='1';
s2:='1024';
if s1<=s2 then writeln (s1,s2)
else writeln(s2,s1);
end.

не получается так...
надо вводить дополнительное условие: если одна строка входит в другую с начала...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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

Добавлено через 2 мин.
Кстати, есть еще один момент: 2100 - это в любом случае длинная арифметика...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Цитата
Объясни мне тогда, как задать вот этот момент

у меня получилось вот что....
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.



--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


сорри, недосортировывала....
исправила.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






А вот мой вариант...
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.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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



Прикрепленные файлы
Прикрепленный файл  minimal.pas ( 1.01 килобайт ) Кол-во скачиваний: 164
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.09.2020 7:39
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name