В C (Linux), как я смогу узнать, есть ли squareroot (n) = Integer - PullRequest
1 голос
/ 26 августа 2010

В C (linux), как я смогу узнать, является ли квадратный корень числа целым или с плавающей запятой. Я хочу написать программу с использованием указателя на функцию, которая складывает все совершенные квадраты до предела отделен.

Ответы [ 6 ]

4 голосов
/ 26 августа 2010

Вот, пожалуйста. Скомпилируйте его с -lm в Linux.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int checkRoot(double n) {
    long n_sqrt = (long)(sqrt(n)+0.5);
    return n_sqrt*n_sqrt == n;
}

int main() {
    double n = 9.0;
    if(checkRoot(n)) {
        puts("Perfect root.");
    }
    else {
        puts("Not quite.");
    }
    return EXIT_SUCCESS;
}

Вы также должны прочитать это обсуждение.

2 голосов
/ 26 августа 2010

Не совсем тот ответ, который вы ищете, но я думаю, что гораздо лучше просто сложить квадраты целых чисел, попадающих в диапазон, чем пытаться использовать sqrt, чтобы определить, является ли число идеальным квадратом (как предлагается в некоторых комментариях к вопросу). Это исключает необходимость использования значений с плавающей запятой, что делает его намного более надежным в качестве решения общего назначения.

#include <stdio.h>

long long sum_squares(int limit){
    int i;
    long long ret=0;
    for (i=1;i*i<=limit;i++){
        ret+=i*i;
    }
    return ret;
}

int main(){
    printf("%lld\n",sum_squares(10));
    return 0;
}
2 голосов
/ 26 августа 2010

Возможно, вы захотите посмотреть статью , что должен знать каждый компьютерщик об арифметике с плавающей запятой Дэвида Голдберга, и пересмотреть свой вопрос.

1 голос
/ 26 августа 2010

Математическая нит: Предполагая, что n является целым числом, квадратный корень никогда не является числом с плавающей запятой.Это либо целое число (в случае совершенных квадратов), либо иррациональное число (которое не может быть представлено вообще, за исключением специальных библиотек символьной математики).

1 голос
/ 26 августа 2010

Вы можете использовать метод Ньютона-Ральфсона для реализации квадратного корня для целых чисел самостоятельно. Но для проблемы, о которой вы говорите, я бы рекомендовал вместо этого вычислить квадраты всех целых чисел.

/* Returns the greatest integer that's <= to the square root. */
unsigned int isqrt(unsigned int x)
{
    if (x < 4) {
        return 1;
    } else {
        unsigned int try = x / 2;
        while ((x / try) < try) {
            try = (try + (x / try)) / 2;
        }
        return try;
    }
}

int check_perfect_square(unsigned int x)
{
    unsigned int sqrt = isqrt(x);
    return (sqrt * sqrt) == x;
}

И, для моего фактического предложенного решения:

unsigned int sum_perfect_squares(unsigned int limit)
{
    unsigned int sum = 0;
    unsigned int i = 1;
    for (i = 1; i * i < limit; ++i) {
        sum += i * i;
    }
    return sum;
}
1 голос
/ 26 августа 2010
float root = sqrt(number);
int int_root = (int) root;
if ( (root / (float)int_root) == 1.0f ) return "is integer";  

Это может сработать. Оптимизируйте это немного.

или

float root;
if ((root % (int)root) == 0) { return "is integer";)

Более простое решение

int SUM_PERFECT_SQUARES (int limit) {
    int sum = 0;
    for (int i = 0; i < floor(sqrt(limit)); i++) {
        sum += i*i;
    }
    return sum;
}
...