何摆鱼呀 发表于 2020-2-4 20:44:18

执行程序时sqrt报错

#include <stdio.h>
#include <math.h>

int main()
{
      unsigned long long num = 600851475143;

      for(unsigned long long i = (unsigned long long)sqrt((double)num); i > 0; i--) // sqre执行时报错,在头文件加了math.h
      {
                if (!(num % i))
                {
                        printf("%llu", i);
                        break;
                }
      }
      return 0;
}



unbunto告警信息如下:
/tmp/ccRMBou7.o:在函数‘main’中:
test3.c:(.text+0x3c):对‘sqrt’未定义的引用
collect2: error: ld returned 1 exit status

EthanHsiung 发表于 2020-2-4 21:35:47

把for里面第一项定义和赋值语句提出来:
      unsigned long long i = (unsigned long long)sqrt((double)num);
      for(i; i > 0; i--)
可能是因为括号的原因导致无法编译

何摆鱼呀 发表于 2020-2-4 23:47:32

EthanHsiung 发表于 2020-2-4 21:35
把for里面第一项定义和赋值语句提出来:
      unsigned long long i = (unsigned long long)sqrt((doub ...

还是不可以{:5_100:}

EthanHsiung 发表于 2020-2-5 00:23:39

何摆鱼呀 发表于 2020-2-4 23:47
还是不可以

编译的时候在指令后面加 -lm试试

一个账号 发表于 2020-2-5 10:06:01

先声明一下 i 试试:

#include <stdio.h>
#include <math.h>

int main()
{
      unsigned long long num = 600851475143, i;      // 修改

      for(i = (unsigned long long)sqrt((double)num); i > 0; i--) // 修改
      {
                if (!(num % i))
                {
                        printf("%llu", i);
                        break;
                }
      }
      return 0;
}

何摆鱼呀 发表于 2020-2-5 19:05:33

一个账号 发表于 2020-2-5 10:06
先声明一下 i 试试:

还是不能编译过, 加上-lm就可以编译过

何摆鱼呀 发表于 2020-2-5 19:07:03

EthanHsiung 发表于 2020-2-5 00:23
编译的时候在指令后面加 -lm试试

加了-lm可以编译通过, 是不是只要Linux系统使用了math库就需要在编译时加上-lm

EthanHsiung 发表于 2020-2-5 19:09:39

何摆鱼呀 发表于 2020-2-5 19:07
加了-lm可以编译通过, 是不是只要Linux系统使用了math库就需要在编译时加上-lm

是的,之前没注意是在Linux上,加-lm是为了链接上这个库

何摆鱼呀 发表于 2020-2-5 19:12:41

EthanHsiung 发表于 2020-2-5 00:23
编译的时候在指令后面加 -lm试试

for(unsigned long long i = (unsigned long long)sqrt((double)num); i > 0; i--)    为什么num的平方根可以保证i是素数

EthanHsiung 发表于 2020-2-5 19:19:21

何摆鱼呀 发表于 2020-2-5 19:12
for(unsigned long long i = (unsigned long long)sqrt((double)num); i > 0; i--)    为什么num的平方根 ...

i是num的平方根强制转换成整型的结果,不能保证i是素数
页: [1]
查看完整版本: 执行程序时sqrt报错