[英]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.