我正在写一个素数发现者.在数学上,它更快,而不是for (unsigned long i = 2; i < number/2; i++)更快,并且仍然同样有效for (unsigned long i = 2; i < sqrt(number); i++)
但它不起作用.以下是我的代码.
// Stuff goes up here, including a function prototype and:
#include <math.h>
char isPrime (unsigned long number)
{
if (number <= 1) {
return 0;
}
long double sqrtOfNumber = sqrt(number); // Calculate once.
for (unsigned long i = 2; i < sqrtOfNumber; i++) {
if (number%i == 0) { // It has a divisor.
return 0;
}
}
// Nothing broke us yet....
return 1;
}
Run Code Online (Sandbox Code Playgroud)
然后下面是我从GCC得到的错误.
/tmp/ccFBlUz5.o: In function `isPrime':
main.c:(.text+0xb3): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
将"数字"的类型更改为double会导致%运算符出现问题.并且将它转换为sqrt()调用的double不会改变任何东西.
有什么建议?
哦,我的math.h正在导入,如果我注释掉那一行,我会收到警告,那里有一个隐含的声明.
main.c: In function 'isPrime':
main.c:28:2: warning: implicit declaration of function 'sqrt' [-Wimplicit-function-declaration]
long double sqrtOfNumber = sqrt(number); // Calculate once.
^
main.c:28:29: warning: incompatible implicit declaration of built-in function 'sqrt' [enabled by default]
long double sqrtOfNumber = sqrt(number); // Calculate once.
^
Run Code Online (Sandbox Code Playgroud)
再加上另一个警告.
Sha*_*our 13
-lm需要在需要该库的文件之后添加到命令行,例如,如果main.c需要数学库,那么您将使用:
gcc -x c main.c -lm
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看实例,示例中有三个命令行.一个没有-lm,一个-lm在文件之前需要它一个需要它的文件之后.
为了完整起见,如果我们在链接的选项上引用gcc文档,则说明以下内容-l:
[...]在您编写此选项的命令中,它会有所不同; 链接器按照指定的顺序搜索和处理库和目标文件.因此,'foo.o -lz bar.o'在文件foo.o之后但在bar.o之前搜索库'z'.如果bar.o引用'z'中的函数,则可能无法加载这些函数.[...]
| 归档时间: |
|
| 查看次数: |
23448 次 |
| 最近记录: |