Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите с задачей
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
StudentTNGU
Помогите решить задачку, плиз. Сижу парюсь с ней уже весь день... Перечитал лекции, книжки по паскалю - понять не могу как решить. Вот задачка:
Найти все трехзначные числа кратные 7 и сумма цифр которых тоже кратна 7.
Плж помогите...
klem4
Ну вот самый простой вариант:

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
Гость
Цитата(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 цикла?


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

Для каждой цикл. Можно былобы конечно сделать одним циклом, но тогда придется выделять цифры из числа, но как видишь можно обойтичь и без этого.
volvo
klem4, то есть, число 518, например, по-твоему, на 7 никак не делится? (я про циклы до 7 максимум) smile.gif
(вопрос был про 3-значные)
klem4
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
Вот самый правильный вариант:
Код

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
Всем большое спасибо за помощь. Теперь все работает.
klem4
Цитата
Вот самый правильный вариант:


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

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

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

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

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


Не соглашусь ... Но и спорить с тобой дальше тоже не собираюсь. Вопрос решен, тема закрыта.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.