在我的C类作业中,我们必须编写一个程序来检查整数是否为素数。我在sqrt()函数中收到错误。我的教授告诉我num必须是一个整数,我们必须使用sqrt()函数。我认为问题是sqrt()函数不能用于整数,但我的教授告诉我它可以,并且我从其他东西得到错误。你们看到了这个问题吗?
int primality(int num)
{
int isprime;
/*check if num is prime*/
for (int i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
isprime = 0; /*is not prime*/
else
isprime = 1; /*is prime*/
}
if (isprime == 0)
return 0;
elseif (isprime == 1)
return 1;
}
编辑: 是的我使用math.h并编译为C代码。
错误消息“错误:多个重载函数实例”sqrt“与参数列表匹配。
答案 0 :(得分:4)
C语言没有“重载”。我敢打赌,你是用C ++编译你的代码,而不是C.如果你正在使用GCC,请使用gcc
进行编译,而不是g++
。如果您使用的是Visual Studio,则项目属性中有一个选项:
在任何一种情况下,请使用.c
扩展名命名您的文件(小写'c')。
实际上,在C中只有一个sqrt
,定义为
double sqrt(double);
和整数转换为double。
答案 1 :(得分:2)
你不想在你的循环中return 1
- 它需要在循环完成之后。您的教授是正确的,sqrt(num)
将起作用 - num
将自动升级为double
- C具有函数调用中类型更改的规则等。您需要包含math.h
如果你在程序的其他地方没有这样做 - 你得到了什么错误?
答案 2 :(得分:1)
你的逻辑错了:
if (num % i == 0)
return 0; /*is not prime*/
else
return 1; /*is prime*/
如果您考虑一下,如果数字不能被2整除,则您的函数会立即返回1
。
你return
太早了。请记住,return
基本上会阻止您的功能并突破它。
相反,当数字是复合数时,尝试仅打开 ,当您确定它是素数时,只返回<{1}} 。
正如旁注,您的函数会将素数的平方(即True
,9
,25
)注册为素数,因为您使用的是49
符号你的<
循环。
将其更改为for
符号,因为这会将平方根作为该数字的唯一除数。
答案 3 :(得分:0)
你有#include <math.h>
吗?
另外,根据你的功能1,2和3回来时不是素数...可能想要解决这个问题。我会提供更多的帮助,但听起来这是为了做作业,我宁愿不只是给你答案(一些大学认为它作弊)。
答案 4 :(得分:0)
回答你的实际问题:sqrt()没有int的重载,但它有double和float的重载,因此编译器无法猜出要使用哪一个。
答案 5 :(得分:0)
问题是sqrt函数不会将整数作为参数。你会想做
sqrt((double)n)或sqrt((float)n)来修复它。
答案 6 :(得分:0)
如果您添加了#include <math.h>
,则可以通过将for (int i = 2; i <= sqrt(num); i++)
更改为简单声明的变量(例如sqrt(num)
)来修复错误:n, x, i...
,因为sqrt(num)
已经在math.h
库中使用过。
答案 7 :(得分:-2)
sqrt()
的函数定义为double sqrt(double)
,因此您输入的内容应为double或float。
要将integer
变量转换为float
而不更改类型,请使用float( integer_Variable )
例如,在你的代码中写i<=sqrt(float(num));