Другие языки программирования и технологии

Задача на Delphi (сложная)

Помогите пожалуйсто решить задачу:"Дан файл целых чисел. Найти количество квадратов нечетных чисел среди компонент этого файла."(Поясняю: Например дан файл Примет.txt (путь к файлу вводится через Edit) в нем написаны 40(число может быть любым) цифр через пробел. по нажатию кнопки программа высчитывает корень из каждого числа и проверяет является или полученное число нечетным и так с каждым числом после вычисления всех цифр выводит количество и какие числа являются квадратами нечетных чисел в Label)
Доброго времени суток.

Чтение из файла в строковую переменную с последующим выделением чисел нормальная идея. Занесение их в массив считаю лишним, поскольку результат формируется в лейбле, то нет никакого смысла хранить все числа. Взял очередное, обработал и забыл про него. А вот на счет техники хочу поговорить. :-)

2*n+1 любое нечетное число. Возведем его в квадрат

(2*n+1)^2 = 4*n^2 + 4*n + 1 = 4*(n^2 + n) + 1

Т. е. квадрат нечетного числа есть число нечетное, т. к. первое слагаемое четное из-за 4 в произведении. Идем дальше. Несколько возведений в квадрат нечетных чисел обнаруживают любопытную закономерность - эти квадраты оканчиваются на 1, 5 или 9. Следовательно, получив из строки очередное число и проверив его последнюю цифру можно выявить претендентов на ответ. Остальные попросту игнорируем. Теперь посмотрим на первое слагаемое. Оно делится на 4. Отсюда и алгоритм: из числа, порлученного после проверки последней цифры вычитаем 1 и проверяем остаток на делимость на 4. Признаком делимости некоторого числа на 4 является деление на 4 двух последних его цифр. Вот и все. Не надо никаких извлечений квадратного корня. Тем более, что функция Sqrt возвращает действительное число, а понятие нечетности имеет смыл только для целых.

Т. о. программка будет такой (строка из файла в переменной S).

k := 0; {счетчик квадратов нечетных чисел}
S := Trim(S) + ' '; {чтобы не потерять последнее число}
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 (((n-1) mod 100) mod 4 = 0) then begin
k := k + 1; {увеличили счетчик}
Label1.Caption := Label1.Caption + ' ' + IntToStr(n); {добавили число к лейблу}
end;
end;

Остальное сами.

Удачи!
Асхат Казаков
Асхат Казаков
59 613
Лучший ответ
Да уж, если это сложная задача, то какой по вашему калькулятор?
Если седня тебе не помогут, то обращайся завтра, напиши мне на почту, помогу.
Андрюша Адекват и добавь "за минет"
А чего сложного? Загружаешь текст из файла в строковую переменную. . Потом из этой переменной функцией POS по признаку разделения цифр выделяешь каждую циру (признак - пробел запятая и т. п. между цифрами) и заносишь в массив, а дальше дело техники... .
З. Ы. не забудь определить сколько получилось цифр, чтобы циклы обработки массива не гонять в пустую