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

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

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

 
 Ответить  Открыть новую тему 
> Задача на строки и числа.
1qsd
сообщение 15.03.2007 19:34
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.03.2007 19:52
Сообщение #2


Гость






Фактически задача сводится к сортировке полученных чисел - степеней двойки (только сортировать их надо НЕ как числа, а как строки)... После того, как массив таких строк будет отсортирован по возрастанию, достаточно выписать все его элементы подряд...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 16.03.2007 0:46
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.03.2007 1:24
Сообщение #4


Гость






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

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

Добавлено через 2 мин.
Кстати, есть еще один момент: 2100 - это в любом случае длинная арифметика...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 16.03.2007 2:04
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.03.2007 2:15
Сообщение #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
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 16.03.2007 2:20
Сообщение #7


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

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

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


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.03.2007 2:23
Сообщение #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.

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


Гость






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



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

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

 



- Текстовая версия 28.04.2024 21:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"