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

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

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

> задача про натуральное число
Sofo4ka
сообщение 24.10.2006 19:14
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский

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


задуманно натуральное число х.известны три числа- остатки от деления этого числа 3,5,7 - i,j,k соответсвенно. найти Х
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 10)
klem4
сообщение 24.10.2006 21:57
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


а что непонятного ?

X mod 3 = a
X mod 5 = b
X mod 7 = c


a, b, c - известны

Задача кстати решалась, можно поискать.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 24.10.2006 22:06
Сообщение #3


Гость






х=3l*i
x=5m*j
x=7t*k


потом типа 3l*i=5m*j

так объяснили
 К началу страницы 
+ Ответить 
volvo
сообщение 24.10.2006 22:18
Сообщение #4


Гость






Sofo4ka, простым перебором чисел находишь те, что удовлетворяют заданным условиям. Этого тебе вполне хватит (все официальные решения с олимпиад этой задачи основывались именно на переборе - проблем ни у кого не возникло...)
 К началу страницы 
+ Ответить 
Sofo4ka
сообщение 25.10.2006 13:44
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Женский

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


а у мя возникла )
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.10.2006 13:48
Сообщение #6


Гость






В чем именно?

Запустить цикл от 1 до 32767 (максимально возможное число для Integer), и для каждого числа проверять равенство остатков от его деления на 3, 5, 7 числам i, j, k соответственно?
 К началу страницы 
+ Ответить 
klem4
сообщение 25.10.2006 14:10
Сообщение #7


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


Вот что я придумал :

uses crt;
var
i, j, k: Integer;
c1, c2, c3, a, b, c: Integer;
find: boolean;

begin
clrscr;

write('i = '); readln(i);
write('j = '); readln(j);
write('k = '); readln(k);

find := false;
c1 := 0;

while (c1 < maxint) and not(find) do begin
a := c1 * 3 + i;
c2 := 1;
while (c2 < maxint) and not(find) do begin
b := c2 * 5 + j;
if b > a then break;
c3 := 1;
while (c3 < maxint) and not(find) do begin
c := c3 * 7 + k;
if (c > b) or (c > a) then break;
find := ((a = b) and (a = c));
inc(c3);
end;
inc(c2);
end;
inc(c1);
end;


if find then writeln(a)
else writeln('No found !');

readln;
end.


Вот только будет ли это быстрее обычного перебора unsure.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 25.10.2006 14:37
Сообщение #8


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


Невероятно smile.gif

  global := 0;
t1 := GetTickCount;

repeat
while (c1 < maxint) and not(find) do begin
a := c1 * 3 + i;
c2 := 1;
while (c2 < maxint) and not(find) do begin
b := c2 * 5 + j;
if b > a then break;
c3 := 1;
while (c3 < maxint) and not(find) do begin
c := c3 * 7 + k;
if (c > b) or (c > a) then break;
find := ((a = b) and (a = c));
inc(c3);
end;
inc(c2);
end;
inc(c1);
end;

inc(global);
until global = 900000;

writeln('Result = ',a);

t2 := GetTickCount;
writeln('Time1 = ', t2 - t1);

global := 0;
t1 := GetTickCount;

repeat
for p := 1 to maxint do
if (p mod 3 = i) and (p mod 5 = j) and (p mod 7 = k) then break;
inc(global);
until global = 900000;

t2 := GetTickCount;
writeln('Time2 = ', t2 - t1);

writeln('Result = ', p);


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.10.2006 14:56
Сообщение #9


Гость






Цитата
Невероятно smile.gif

Потому, что некорректно smile.gif Ты же не инициализируешь Find и C1 заново при каждой итерации, следовательно, у тебя в первом случае показывается время одной итерации, а во втором - время ВСЕХ... Вот так - корректнее:

uses windows, crt;
var
i, j, k: Integer;
c1, c2, c3, a, b, c,
p, global: Integer;
find: boolean;

T: dword;

begin
clrscr;

write('i = '); readln(i);
write('j = '); readln(j);
write('k = '); readln(k);

T := gettickcount();


global := 0;
repeat
find := false;
c1 := 0;
while (c1 < maxint) and not(find) do begin
a := c1 * 3 + i;
c2 := 1;
while (c2 < maxint) and not(find) do begin
b := c2 * 5 + j;
if b > a then break;
c3 := 1;
while (c3 < maxint) and not(find) do begin
c := c3 * 7 + k;
if (c > b) or (c > a) then break;
find := ((a = b) and (a = c));
inc(c3);
end;
inc(c2);
end;
inc(c1);
end;

inc(global);
until global = 900000;

if find then writeln(a)
else writeln('No found !');
writeln('klem1:: Time = ', gettickcount() - T);


T := GetTickCount();

global := 0;

repeat
for p := 1 to maxint do
if (p mod 3 = i) and (p mod 5 = j) and (p mod 7 = k) then break;

inc(global);
until (global = 900000);

writeln('Result = ', p);
writeln('klem2:: Time = ', gettickcount() - T);


readln;
end.


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 
klem4
сообщение 25.10.2006 15:00
Сообщение #10


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


LOL smile.gif))))

Спасибо smile.gif)))

Sofo4ka, используй простой перебор smile.gif



--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 25.10.2006 15:26
Сообщение #11


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


Только перебирать надо не до 32767, а до 3*5*7.

Если a == b (mod 3), то (a-b) == 0 (mod 3)
Если a == b (mod 5), то (a-b) == 0 (mod 5)
Если a == b (mod 7), то (a-b) == 0 (mod 7)

А если (a-b) == 0 (mod 3, 5 и 7), то (a-b) == 0 mod (3 * 5 * 7).

Поэтому, найдя первый ответ X, надо выводить по очереди все числа вида X + 105 * K, и только их.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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