在为我的课程编写代码时,我设法在Python中创建了一个工作示例,该示例遵循我的教授为我们设定的所有要求。但是当我将它翻译成C并将其交给我的教授时,我发现了几个问题,我认为我设法环绕了,但事实证明我错了。
我发现的一个问题是在Python中我使用以下代码来确定平方根是否是自然数。
if (math.sqrt(a**2+b**2)%2)==1 or (math.sqrt(a**2+b**2)%2)==0:
当我在C中翻译时,我发现我在尝试编译代码时收到错误消息,说我试图用整数和其他很多东西模拟浮点数。
我在C中做了一些测试运行以了解root周围的环境,发现如果root是自然数,则指定为float或double的变量返回0。
#include<stdio.h>
#include<math.h>
int main()
{
float r_float_a, r_float_b;
int a=16,b=15,r_int_a,r_int_b;
r_float_a=sqrt(a);
r_float_b=sqrt(b);
r_int_a=sqrt(a);
r_int_b=sqrt(b);
printf("%d\n",r_float_a);
printf("%d\n",r_float_b);
printf("%d\n",r_int_a);
printf("%d\n",r_int_b);
}
但是如果我试图在if语句中调用r_float_a,那么无论a的值是什么,它总是会返回false:
#include<stdio.h>
#include<math.h>
int main()
{
float r_float_a, r_float_b;
int a=16,b=15,r_int_a,r_int_b;
r_float_a=sqrt(a);
r_float_b=sqrt(b);
r_int_a=sqrt(a);
r_int_b=sqrt(b);
printf("%d\n",r_float_a);
printf("%d\n",r_float_b);
if (r_float_a==0)
{
printf("%d\n",r_int_a);
}
else
{
printf("%d\n",r_int_b);
}
}
如何解决此问题,以便检查数字的平方根是否为自然数?
答案 0 :(得分:2)
显然,如果数字的平方根是自然(整数)数,那么数字本身也是如此。
unsigned a = 15;
unsigned root = (unsigned)sqrt(a);
if (root * root == a)
printf("%u has the natural square root %u\n", a, root);
else
printf("%u does not have a natural square root\n", a);
我使用unsigned
因为自然数是一个完整的非负数。因此,signed
数字的使用超出了本问题的范围。平方根可以是负数,但这不是自然数。 否定数字的平方根进入复数数字领域。
答案 1 :(得分:0)
对于大型for
,OP和Weather Vane方法失败。 float
通常具有6到8个十进制数字的精度。对于大于float
的数字,保存为1e14
的{{1}}将始终为整数 - 完全可转换为整数(如果在整数范围内)。
确定sqrt()
是否是另一整数的确切平方:
float
是否为阴性,INF或NaN并且未通过这些病理情况。float x
提取小数部分,如果不是0.0,则失败。x
提取尾数/有效数和指数。检查指数。将偶数幂提高到modff()
位宽以上 - 改革fmodf()
和然后应用@Weather Vane测试。