Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Помогите с задачей

Автор: StudentTNGU 4.12.2006 0:17

Помогите решить задачку, плиз. Сижу парюсь с ней уже весь день... Перечитал лекции, книжки по паскалю - понять не могу как решить. Вот задачка:
Найти все трехзначные числа кратные 7 и сумма цифр которых тоже кратна 7.
Плж помогите...

Автор: klem4 4.12.2006 1:06

Ну вот самый простой вариант:

uses crt;
var
i, j, k, l: Integer;

begin
clrscr;
for i := 1 to 9 do
for j := 0 to 9 do
for k := 0 to 9 do
for l := 0 to 9 do
if (i + j + k + l = 7) and ((i * 1000 + j * 100 + k * 10 + l) mod 7 = 0) then
writeln(i, j, k, l);
readln;
end.



Да и циклы конечно поменьше можно сделать ...

 for i := 1 to 7 do
for j := 0 to 6 do
for k := 0 to 6 do
for l := 0 to 6 do

Автор: Гость 4.12.2006 1:25

Цитата(klem4 @ 3.12.2006 21:06) *

Да и циклы конечно поменьше можно сделать ...

 for i := 1 to 7 do
for j := 0 to 6 do
for k := 0 to 6 do
for l := 0 to 6 do


спасибо! Но... почему именно 4 цикла?

Автор: klem4 4.12.2006 1:44

Цитата
спасибо! Но... почему именно 4 цикла?


Потомучто в 4-х значном числе 4 цифры smile.gif

Для каждой цикл. Можно былобы конечно сделать одним циклом, но тогда придется выделять цифры из числа, но как видишь можно обойтичь и без этого.

Автор: volvo 4.12.2006 1:54

klem4, то есть, число 518, например, по-твоему, на 7 никак не делится? (я про циклы до 7 максимум) smile.gif
(вопрос был про 3-значные)

Автор: klem4 4.12.2006 2:05

lol.gif

Цитата

(вопрос был про 3-значные)


Я еще и вторую часть задания не так сделал (сумма чисел = 7, а надо чтобы тоже кратна была) (поэтому цикл до 7 и сделал) smile.gif

Глюки ....

В общем вот для трехзначных вариант если сам не переделал еще smile.gif

for i := 1 to 9 do
for j := 0 to 9 do
for k := 0 to 9 do
if ((i * 100 + j * 10 + k) mod 7 = 0) and ((i + j + k) mod 7 = 0) then
writeln(i, j, k);

Автор: }0pa 4.12.2006 12:31

Вот самый правильный вариант:

Код

uses crt;
var i:integer;

function GetCount_SumDigit(n:integer):boolean;
var c,k,s:integer;

begin
GetCount_SumDigit:=false;
s:=0;k:=0;
while n<>0 do
begin
  c:=n mod 10;
  k:=k+1;
  s:=s+c;
  n:=n div 10;
end;
if  (s mod 7=0) then GetCount_SumDigit:=true;
end;

begin
for i:=100 to 999 do
if (GetCount_SumDigit(i)=true)and(i mod 7=0) then writeln(i)
end.

Автор: StudentTNGU 4.12.2006 13:14

Всем большое спасибо за помощь. Теперь все работает.

Автор: klem4 4.12.2006 17:06

Цитата
Вот самый правильный вариант:


И с чего ты это взял ? среднее время (1000 прогонов)

Моя: 2063 ms
Твоя: 2283 ms

Так что ...

Автор: }0pa 4.12.2006 17:58

Ну,может быть чуть быстрей, но согласись, что мой вариант более понятен!!!Хотя это дело вкуса, меня просто так учили!В данном случае, главное результат smile.gif

М
Чему тебя учили - это никого не интересует... Главное - чему НАучили... А вот тут у тебя проблемы. Пока от тебя исходит только чрезмерная уверенность, ничем больше не подкрепленная! (заявления типа "Вот самый правильный вариант" вообще очень опасны, ты же не знаешь КРИТЕРИЕВ, по которым будет оцениваться программа, а вот по критерию легкости повторного использования, извини, твоя программа - пример как НЕ НАДО делать, потому что ТЫ ЖЕ в ней через месяц не разберешься, или разберешься с трудом)...
volvo


Автор: klem4 4.12.2006 18:18

Цитата
о согласись, что мой вариант более понятен


Не соглашусь ... Но и спорить с тобой дальше тоже не собираюсь. Вопрос решен, тема закрыта.