错误:多个重载函数“sqrt”的实例与参数列表匹配。那是什么?

时间:2011-10-31 22:36:38

标签: c math

在我的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“与参数列表匹配。

8 个答案:

答案 0 :(得分:4)

C语言没有“重载”。我敢打赌,你是用C ++编译你的代码,而不是C.如果你正在使用GCC,请使用gcc进行编译,而不是g++。如果您使用的是Visual Studio,则项目属性中有一个选项:

  1. 右键点击您的项目
  2. 点击属性
  3. 点击C / C ++
  4. 点击高级
  5. 将属性“compile as”设置为C Code(/ TC)
  6. 在任何一种情况下,请使用.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}}

正如旁注,您的函数会将素数的平方(即True925)注册为素数,因为您使用的是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));