Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2013, 16:41   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию Программа печати всех делителей натурального числа A

Привет всем!

Правильно ли написана вот эта программа: http://acmp.ru/article.asp?id_text=141

Я для удобства её приведу:
Код:
{ Составить программу печати всех делителей натурального числа A }
var a,n,c,d:word;
begin { основная программа }
    readln( a );
    n:=1;
    while ( n <= sqrt(a) ) do begin
       c:=a mod n;
       d:=a div n;
       if c = 0 then begin
          writeln( n );
          if n <> d then writeln( d );
       end;
       inc( n );
    end;
end.
Меня смущает строка:

Код:
while ( n <= sqrt(a) ) do begin
А именно, меньше или равно. Функция sqrt возвращает вещественный тип и может возникнуть такая ситуация: sqrt(49) = 7.0000000000000001 Я прав? Ведь n будет приведён к вещественному. Сравнивать на равенство два вещественных типа - некорректно.
8Observer8 вне форума Ответить с цитированием
Старый 09.09.2013, 16:57   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, напишите так:
Код:
while ( sqr(n) <= a )  do begin
во-вторых, можно использовать приведение к целому типу через trunc: n <= Trunc(sqrt(N)+0.1)

в-третьих, имхо, и так, как у Вас написано, будет корректно работать (хотя, Ваша подозрительность, на мой взгляд, вполне оправдана!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.09.2013, 16:58   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Уж обсуждали
тыц
тыц
Poma][a вне форума Ответить с цитированием
Старый 09.09.2013, 17:59   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Спасибо большое, парни!) Как посоветовали так и сделал. Только я на С++:
Код:
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;

int main(int argc, char** argv) {
    int a;
    cin >> a;

    int b = trunc(sqrt(a)+0.1);

    int n = 1;
    div_t divresult;

    while (n <= b) {
        divresult = div(a, n);
        if (divresult.rem == 0) {
            cout << n << endl;
            if (n != divresult.quot) {
                cout << divresult.quot << endl;
            }
        }
        ++n;
    }
    
    return 0;
}

Последний раз редактировалось 8Observer8; 09.09.2013 в 18:04.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
найти сумму всех делителей числа (С++) yula92 Помощь студентам 13 19.05.2010 00:02
Составить программу нахождения всех делителей натурального числа N livestrong Помощь студентам 1 24.12.2008 20:35
Составить программу нахождения всех делителей натурального числа N livestrong Помощь студентам 3 24.12.2008 19:02
вывод на экран наибольшего делителя натурального числа N, меньше заданного натурального M Fatality Помощь студентам 2 03.12.2008 23:27