在C(linux)中,我如何能够找出数字的平方根是整数还是浮点数。 我想用函数指针编写一个程序,它将所有Perfect方块相加 达到最高限度。
答案 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;
}
答案 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
是一个整数,平方根永远不是一个浮点数。它可以是整数(在完美正方形的情况下)或无理数(除非使用特殊的符号数学库,否则无法表示)。