Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите найти ошибку в коде

Ka.Ma.Ev Профи (635), закрыт 14 лет назад
ЗАДАНИЕ : Дан файл целых чисел. Найти количество квадратов нечетных чисел среди компонент этого файла.
СПОСОБ РЕШЕНИЯ : Квадрат нечетного числа есть число нечетное, так как первое слагаемое четное из-за 4 в произведении. Несколько возведений в квадрат нечетных чисел обнаруживают любопытную закономерность - эти квадраты оканчиваются на 1, 5 или 9. Следовательно, получив из строки очередное число и проверив его последнюю цифру можно выявить претендентов на ответ. Остальные попросту игнорируем. Теперь посмотрим на первое слагаемое. Оно делится на 4. Отсюда и алгоритм: из числа, полученного после проверки последней цифры вычитаем 1 и проверяем остаток на делимость на 4. Признаком делимости некоторого числа на 4 является деление на 4 двух последних его цифр. Вот и все. Не надо никаких извлечений квадратного корня. Тем более, что функция Sqrt возвращает действительное число, а понятие нечетности имеет смыл только для целых.
КОД : var
F : TextFile;
S, S1 : String;
k, n : Integer;
begin
AssignFile(F, Edit1.Text);
Reset(F);
while not Eof(F) do begin
ReadLn(F, S);
k := 0; {счетчик квадратов нечетных чисел}
S := Trim(S) + ' '; {чтобы не потерять последнее число}
if S <> ' ' then
while Pos(' ', S) > 0 do begin
n := StrToInt(Copy(S, 1, Pos(' ', S)-1)); {берем очередное число из строки}
System.Delete(S, 1, Pos(' ', S)); {и удаляем его}
if ((n mod 10) in [1,5,9]) and {число заканчивается на 1, 5 или 9}
(((n-1) mod 100) mod 4 = 0) and {делится на 4}
(((n-1) div 4) mod 2 = 0) then begin {и остаток от деления четный}
k := k + 1; {увеличили счетчик}
Label1.Caption := Label1.Caption + ' ' + IntToStr(n); {добавили число к лейблу}
end;

ПОМОГИТЕ: Я не могу понять вроде уже все проверил после нажатии кнопки
с правильным ответами выводятся 41,89,105 хотя они ими не являются
и это я тока до 110 проверил не знаю что будет дольше. найдите ошибку
почему не выполняется корректно (((n-1) mod 100) mod 4 = 0) and {делится на 4}
(((n-1) div 4) mod 2 = 0) {и остаток от деления четный}
Дополнен 14 лет назад
Вы зацепились за 41 а они еще 105 и 89 выдает
Лучший ответ
Gennady Гений (60211) 14 лет назад
Доброго времени суток.

Используйте вместо

if ((n mod 10) in [1,5,9]) and {число заканчивается на 1, 5 или 9}
(((n-1) mod 100) mod 4 = 0) and {делится на 4}
(((n-1) div 4) mod 2 = 0) then begin {и остаток от деления четный}

такое условие

if ((n mod 10) in [1,5,9]) and (Sqr(Trunc(Sqrt(n))) = n) then begin

Как показала практика, с корнем проще и точнее. Извлекается корень, обрезается дробная часть, если она есть и результкт возводится в квадрат. Если этот квадрат равен исходному числу, то это ответ. 1,5 и 9 нужны для того, чтобы отсечь квадраты четных чисел.

Удачи!
Остальные ответы
Всеволод Коваленко БиК Мыслитель (8415) 14 лет назад
Первая строка условия, ты ищешь числа оканчивающиеся на 1, 41 подходит.
Вторая строчка, 41-1 остаток от деления на 4 равен нулю
Третья строчка 41-1 на 4 равно 10, 10 по модулю два равно нулю.

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

Кстати о Sqrt....можно извлечь корень, округлить, возвести в квадрат и сравнить.
Великий Шушпанчик Мудрец (13311) 14 лет назад
Вот чесслово трудно анализировать этот код. А чтоб проверить нуна еще и файлик набивать. А так навскидку 41

1. оканчивается на 1.
2. n-1 т. е. 41-1=40 и этот 40 как раз делится на 4.
3. остаток от деления 40 на 4 = 0 (ну это вообщето всегда так будет, так как оно и так делится на 4) и 0 как раз четный.

Ну вот как бы и фсе.. .

ЗЫ, не напрягай проц ненужным, это нам легче взять две последние цифры. А он то в твоем примере честно делит на 100, да потом еще и на 4. Да дели ты просто на 4. А еще лучше тупо извлекай корни. Процу от этого только легче станет. А Real в Integer преобразуется с помощью trunc

ЗЫЫ в дельфе мона прогонять код пошагово, и смотреть что в переменных.
Похожие вопросы