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

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

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

> Натуральные числа, найти число
Айра
сообщение 31.10.2007 23:16
Сообщение #1


Профи
****

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

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


Цитата
Для любого натурального n найти число, составленное из 1-ц и 2-ек, делящееся на 2n

Вот что у меня получилось:
var n,n2,a,d,x,ch: longint;
f: boolean;
const max=2147483647;
begin
write('введите значение n: ');
readln(n);
if (n mod 5=0) then writeln('для n=',n,' искомого числа не существует')
else
begin
a:=0;
n2:=2*n;
x:=0;
repeat
begin
f:=true;
x:=0;
a:=a+n2;
d:=a;
while (d<>0) and f do
begin
ch:=d mod 10;
if (ch<>1) and (ch<>2) then f:=false;
d:=d div 10;
end;
if f then x:=a;
end;
until (a>=max) or f;
writeln('для n=',n,' x=',x,'')
end;
end.

Вроде работает нормально.. но может можно что-то упростить или сделать лучше? rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Айра
сообщение 1.11.2007 1:49
Сообщение #2


Профи
****

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

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


Цитата
Кодn2:=2*n;
я бы заменил на:
Кодn2:=n+n;

Хм.. а это потому что сложение выполняется быстрее умножения wink.gif или как?

Исправления внесла, всем спасибо))

Цитата
..то и незачем n2 прибавлять...

С n2 я так поняла: вот, например, когда я ввожу 6, то n2=12 - уже подходит, а если я введу 2 - будет сначала 4, потом 8, и только потом 12.. т.е. чтобы добраться до искомого числа мне нужно двигаться с шагом n2, или можно как-то по-другому?

Сообщение отредактировано: Айра - 1.11.2007 1:50
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 1.11.2007 2:36
Сообщение #3


Профи
****

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

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


Цитата(Айра @ 1.11.2007 1:49) *

С n2 я так поняла: вот, например, когда я ввожу 6, то n2=12 - уже подходит, а если я введу 2 - будет сначала 4, потом 8, и только потом 12.. т.е. чтобы добраться до искомого числа мне нужно двигаться с шагом n2, или можно как-то по-другому?

Можно попробовать зайти с другой стороны.. Идти именно по числам, состоящим из 1,2 и проверять на делимость с 2*n. Количество таких чисел по идее меньше (769 всего до MaxLongInt) чем MaxLongINt / 2*n (Хотя это конечно от N зависит smile.gif ) Чтобы идти по таким числам подряд достаточно переводить счетчик в двоичную систему и прибавлять 1-цу к каждому разряду.. Здесь вычислений поболее будет, но в целом должно быть быстрее smile.gif
Вот примерчик:

var s,p,i,x,n:longint;
begin
readln (n);
i:=1;
repeat
x:=i; s:=0; p:=1;
while x>0 do begin
s:=s+((x and 1)+1)*p; x:=x shr 1; p:=p*10;
end;
if (s mod (n shl 1))=0 then begin writeln (s); break; end;
inc (i);
until s<0;
if s<0 then writeln ('Not found..');
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



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