Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
KobaEugeneA
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 166
1

Поиск целочисленного квадратного корня

21.07.2013, 12:40. Просмотров 1296. Ответов 1
Метки нет (Все метки)

Есть программа, которая должна искать целочисленные квадратные корни из целого числа методом деления отрезка пополам. Вот её код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/* Максимальное unsigned long число */
#define MAXINT (~0L)
/* Определим имя-синоним для типа unsigned long */
typedef unsigned long ulong;
/* Функция, корень которой мы ищем: */
#define FUNC(x, arg) ((x) * (x) - (arg))
/* тогда x*x - arg = 0 означает x*x = arg, то есть
* x = корень_квадратный(arg) */
/* Начальный интервал. Должен выбираться исходя из
* особенностей функции FUNC */
#define LEFT_X(arg) 0
#define RIGHT_X(arg) (arg > MAXINT)? MAXINT : (arg/2)+1;
/* КОРЕНЬ КВАДРАТНЫЙ, округленный вниз до целого.
* Решается по методу деления отрезка пополам:
* FUNC(x, arg) = 0; x = ?
*/
ulong i_sqrt( ulong arg ) {
    register ulong mid, /* середина интервала */
            rgt, /* правый край интервала */
            lft; /* левый край интервала */
    lft = LEFT_X(arg); rgt = RIGHT_X(arg);
    do{ mid = (lft + rgt + 1 )/2;
    /* +1 для ошибок округления при целочисленном делении */
        if( FUNC(mid, arg) > 0 ){
            if( rgt == mid ) mid--;
            rgt = mid ; /* приблизить правый край */
        } else lft = mid ; /* приблизить левый край */
    } while( lft < rgt );
    return mid;
}
void main(){ ulong i;
    for(i=0; i <= 100; i++)
    printf("%ld -> %lu\n", i, i_sqrt(i));
}
Вроде всё правильно, но для многих чисел, из которых извлекается целый корень (16, 25, 36, 64, 81, 100) она выдаёт результат - 0. Помогите, пожалуйста, найти ошибку.

Добавлено через 12 минут
Да и для всех остальных значений должен выдаваться результат округлённый вниз до целого, а не 0.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2013, 12:40
Ответы с готовыми решениями:

Поиск квадратного корня из числа
Приветствую. Подскажите, пожалуйста, алгоритм вычисления квадратного корня в...

Вычисление квадратного корня
я уже смотрел на форуме, какой у квадратного корня алгоритм. В основу моего...

Вычисление квадратного корня
Подскажите пожалуйста,нужно написать функцию,вычисляющую корень из числа с...

Нахождение квадратного корня
написать программу для нахождения квадратного корня четырьмя методами:...

Алгоритм нахождения квадратного корня
Алгоритм нахождения квадратного корня из положительного числа x можно...

1
duhast_vladisla
Заблокирован
21.07.2013, 13:49 2
строка. числа беззнаковые, они не бывают меньше нуля. Надо понимать что делают директивы (~0L == -1). перепиши лучше с использованием функций. Я подправил, работает как надо.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
/* Максимальное unsigned long число */
#define MAXINT (~0L)
/* Определим имя-синоним для типа unsigned long */
typedef unsigned long ulong;
/* Функция, корень которой мы ищем: */
#define FUNC(x, arg) ((x) * (x) - (arg))
/* тогда x*x - arg = 0 означает x*x = arg, то есть
* x = корень_квадратный(arg) */
/* Начальный интервал. Должен выбираться исходя из
* особенностей функции FUNC */
#define LEFT_X(arg) 0
#define RIGHT_X(arg) ((arg/2)+1);
/* КОРЕНЬ КВАДРАТНЫЙ, округленный вниз до целого.
* Решается по методу деления отрезка пополам:
* FUNC(x, arg) = 0; x = ?
*/
ulong i_sqrt( int arg ) {
    register int mid, /* середина интервала */
            rgt, /* правый край интервала */
            lft; /* левый край интервала */
    lft = LEFT_X(arg); rgt = RIGHT_X(arg);
    do{ mid = (lft + rgt + 1 )/2;
    /* +1 для ошибок округления при целочисленном делении */
        if( FUNC(mid, arg) > 0 ){
            if( rgt == mid ) mid--;
            rgt = mid ; /* приблизить правый край */
        } else lft = mid ; /* приблизить левый край */
    } while( lft < rgt );
    return mid;
}
int main(){
 
    int i = 0;
 
    for (; i< 50; i++)
        printf("%i -> %i\n", i, i_sqrt(i));
 
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2013, 13:49

В программу добавить функцию - Вычисление квадратного корня
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;matсh.h&gt; int sum (int x,int y)...

Целая часть квадратного корня из длинного числа
Не могу понять, почему программа, в которой массив объявлен глобально, работает...

Создать процедуру, формирующую вектор из максимальных элементов диагоналей целочисленного квадратного массива
нужна помощь по переводу кода в СИ uses crt; type mas=array of integer; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru