繁体   English   中英

在C(Linux)中,我如何确定squareroot(n)=整数

[英]In C (Linux) how will I be able to find out whether squareroot(n) = Integer

在C(linux)中,我如何确定数字的平方根是和整数还是浮点数。 我想使用一个函数指针编写一个程序,该函数指针将所有Perfect平方加起来达到上限。

干得好。 在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;
}

您还应该阅读此讨论。

您可能想看一下这篇论文,每位计算机科学家都应该对 David Goldberg的浮点算术有所了解,然后重新考虑您的问题。

并不是真正要寻找的答案,但是我认为,简单地求和落入范围内的整数的平方要比尝试使用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;
}
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;
}

您可以使用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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM