在C(Linux)中,我如何能够找出squareroot(n)= Integer

时间:2010-08-26 11:46:18

标签: c linux ubuntu

在C(linux)中,我如何能够找出数字的平方根是整数还是浮点数。 我想用函数指针编写一个程序,它将所有Perfect方块相加 达到最高限度。

6 个答案:

答案 0 :(得分:4)

你走了。在Linux上用-lm编译它。

#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;
}

You should also read this discussion.

答案 1 :(得分:2)

您可能需要查看David Goldberg撰写的论文what every computer scientist should know about floating point arithmetic并重新考虑您的问题。

答案 2 :(得分:2)

不是你正在寻找的答案,但我认为简单地总结落入范围的整数的平方比尝试使用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;
}

答案 3 :(得分:1)

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;
}

答案 4 :(得分:1)

您可以使用Newton-Ralphson方法自己实现整数的平方根。但是,对于你所讨论的问题,我建议改为计算所有整数的平方。

/* 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;
}

答案 5 :(得分:1)

数学:假设你的n是一个整数,平方根永远不是一个浮点数。它可以是整数(在完美正方形的情况下)或无理数(除非使用特殊的符号数学库,否则无法表示)。