Другие языки программирования и технологии
Помогите найти ошибку в коде
ЗАДАНИЕ : Дан файл целых чисел. Найти количество квадратов нечетных чисел среди компонент этого файла.СПОСОБ РЕШЕНИЯ : Квадрат нечетного числа есть число нечетное, так как первое слагаемое четное из-за 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) {и остаток от деления четный}
Доброго времени суток.
Используйте вместо
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 нужны для того, чтобы отсечь квадраты четных чисел.
Удачи!
Используйте вместо
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 нужны для того, чтобы отсечь квадраты четных чисел.
Удачи!
Вот чесслово трудно анализировать этот код. А чтоб проверить нуна еще и файлик набивать. А так навскидку 41
1. оканчивается на 1.
2. n-1 т. е. 41-1=40 и этот 40 как раз делится на 4.
3. остаток от деления 40 на 4 = 0 (ну это вообщето всегда так будет, так как оно и так делится на 4) и 0 как раз четный.
Ну вот как бы и фсе.. .
ЗЫ, не напрягай проц ненужным, это нам легче взять две последние цифры. А он то в твоем примере честно делит на 100, да потом еще и на 4. Да дели ты просто на 4. А еще лучше тупо извлекай корни. Процу от этого только легче станет. А Real в Integer преобразуется с помощью trunc
ЗЫЫ в дельфе мона прогонять код пошагово, и смотреть что в переменных.
1. оканчивается на 1.
2. n-1 т. е. 41-1=40 и этот 40 как раз делится на 4.
3. остаток от деления 40 на 4 = 0 (ну это вообщето всегда так будет, так как оно и так делится на 4) и 0 как раз четный.
Ну вот как бы и фсе.. .
ЗЫ, не напрягай проц ненужным, это нам легче взять две последние цифры. А он то в твоем примере честно делит на 100, да потом еще и на 4. Да дели ты просто на 4. А еще лучше тупо извлекай корни. Процу от этого только легче станет. А Real в Integer преобразуется с помощью trunc
ЗЫЫ в дельфе мона прогонять код пошагово, и смотреть что в переменных.
Первая строка условия, ты ищешь числа оканчивающиеся на 1, 41 подходит.
Вторая строчка, 41-1 остаток от деления на 4 равен нулю
Третья строчка 41-1 на 4 равно 10, 10 по модулю два равно нулю.
Вывод не парь мозг и пиши нормальный алгоритм, а не эмпирическую чушь.
Кстати о Sqrt....можно извлечь корень, округлить, возвести в квадрат и сравнить.
Вторая строчка, 41-1 остаток от деления на 4 равен нулю
Третья строчка 41-1 на 4 равно 10, 10 по модулю два равно нулю.
Вывод не парь мозг и пиши нормальный алгоритм, а не эмпирическую чушь.
Кстати о Sqrt....можно извлечь корень, округлить, возвести в квадрат и сравнить.
Похожие вопросы
- помогите найти ошибку в коде на Си
- Помогите найти ошибку в коде. делфи
- Помогите найти ошибки в коде (паскаль)
- Помогите найти ошибку в коде с++. Скорее всего ошибка в сравнении строк.
- помогите найти ошибку в коде VBA exel !
- (PASCAL)помогите найти ошибку в коде задачи, и исправить
- помогите найти ошибку в коде. ПАскаль
- Помогите найти ошибку в коде в паскале
- Помогите исправить ошибку в коде программы на паскале.
- Не могу найти ошибку в коде с++