鱼C论坛

 找回密码
 立即注册
查看: 1073|回复: 10

[已解决]S1E6作业舍罕王的失算

[复制链接]
发表于 2020-1-16 21:42:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Chan歪歪520 于 2020-1-17 22:33 编辑
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.         unsigned long long sum = 0;
  6.         unsigned long long int temp;
  7.         unsigned long long int weight;
  8.         int i;

  9.         for (i=0; i < 64; i++)
  10.         {
  11.                 temp = pow(2,i);
  12.                 sum = sum + temp;
  13.         }

  14.         weight = sum /25000;

  15.         printf("should give %d wheats\n",sum);
  16.         printf("these wheats wheigh %d kgs\n",weight);

  17.         return 0;
  18. }
复制代码


显示pow未定义???请问是怎么回事啊?

  1. /tmp/ccMDamyO.o: In function `main':
  2. test2.c:(.text+0x35): undefined reference to `pow'
  3. collect2: ld returned 1 exit status
复制代码
最佳答案
2020-1-16 21:52:30
本帖最后由 jackz007 于 2020-1-17 11:20 编辑

         在 Linux 系统环境下,用 gcc 编译 C / C++ 代码,如果用到了数学库,必须在编译命令中使用 -lm 选项加以声明。
         用下面的命令编译试试:
  1. gcc -lm -o test2 test2.c
复制代码

         代码中使用数学库是为了计算 2 的指数幂,其实,2 ^ 0 + a ^ 1 + 2 ^ 2 + 2 ^ 3 + ... + 2 ^ 63 = 0xffffffffffffffff,这个数值很特殊,是一个 64 位无符号整型数所能表达的极限值。

         代码中定义的变量都是 unsigned long long,但是,最后在 printf() 中所使用的格式描述符却都是 "%d","%d" 只能把变量当作 32 位变量来显示,在变量的数值超过 32 位的时候,就会出现显示不全的问题,这个显然是隐患!

         于是,我帮楼主修改了一个版本,楼主可以参考一下
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         unsigned long long sum                                ;
  5.         sum = 0xffffffffffffffff                              ; // 其实,代码中的循环就是为了计算出这个数值
  6.         printf("should give %llu wheats\n" , sum)             ;
  7.         printf("these wheats wheigh %llu kgs\n" , sum / 2500) ;
  8. }
复制代码


        编译这个代码,命令行中就可以不用出现 -lm 选项了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-16 21:52:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-1-17 11:20 编辑

         在 Linux 系统环境下,用 gcc 编译 C / C++ 代码,如果用到了数学库,必须在编译命令中使用 -lm 选项加以声明。
         用下面的命令编译试试:
  1. gcc -lm -o test2 test2.c
复制代码

         代码中使用数学库是为了计算 2 的指数幂,其实,2 ^ 0 + a ^ 1 + 2 ^ 2 + 2 ^ 3 + ... + 2 ^ 63 = 0xffffffffffffffff,这个数值很特殊,是一个 64 位无符号整型数所能表达的极限值。

         代码中定义的变量都是 unsigned long long,但是,最后在 printf() 中所使用的格式描述符却都是 "%d","%d" 只能把变量当作 32 位变量来显示,在变量的数值超过 32 位的时候,就会出现显示不全的问题,这个显然是隐患!

         于是,我帮楼主修改了一个版本,楼主可以参考一下
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         unsigned long long sum                                ;
  5.         sum = 0xffffffffffffffff                              ; // 其实,代码中的循环就是为了计算出这个数值
  6.         printf("should give %llu wheats\n" , sum)             ;
  7.         printf("these wheats wheigh %llu kgs\n" , sum / 2500) ;
  8. }
复制代码


        编译这个代码,命令行中就可以不用出现 -lm 选项了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 21:53:50 | 显示全部楼层
temp  类型是不是应该是  double ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-17 10:12:35 | 显示全部楼层
徐颖科 发表于 2020-1-16 21:53
temp  类型是不是应该是  double ?

谢谢你呀!用double 和 int 应该都可以吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-17 10:33:09 | 显示全部楼层
jackz007 发表于 2020-1-16 21:52
在 Linux 系统环境下,用 gcc 编译 C / C++ 代码,如果用到了数学库,必须在编译命令中使用 -lm  ...

谢谢!
gcc 添加了 -lm选项后运行结果:
  1. should give -1 wheats
  2. these wheats wheigh -1323537122 kgs
复制代码

结果是-1是因为溢出了嘛?

运行了您给我的参考程序:
  1. test3.c: In function ‘main’:
  2. test3.c:6: warning: integer constant is too large for ‘long’ type
复制代码

是不是long long 也装不下这么大的数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-17 10:59:53 | 显示全部楼层
本帖最后由 jackz007 于 2020-1-17 11:22 编辑
Chan歪歪520 发表于 2020-1-17 10:33
谢谢!
gcc 添加了 -lm选项后运行结果:


        先把在 printf() 中出现的所有 %d 统统改成 %llu 然后再编译运行看看。

        编译、运行一下以下代码,看看会输出多少。
  1. #include <stdio.h>

  2. main()
  3. {
  4.         printf("the size of long long is %d\n" , sizeof(long long)) ;
  5. }
复制代码


        如果是 4 ,意味着 long long 在你的程序中只是一个 32 位的整型,无法使用 64 位整型数,不具备解这道题的先决条件。如果是 8 ,意味着楼主抄写我的代码时没有抄对,0xffffffffffffffff 一共有 16 个 f(16 个 f 是 8 个字节,正好 64 位),不能多也不能少。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-17 14:57:41 | 显示全部楼层
jackz007 发表于 2020-1-17 10:59
先把在 printf() 中出现的所有 %d 统统改成 %llu 然后再编译运行看看。

        编译、运行 ...

sizeof结果是8,修改成了%u结果对啦,不过会有warning
  1. test3.c: In function ‘main’:
  2. test3.c:6: warning: integer constant is too large for ‘long’ type
  3. should give  4294967295 wheats
复制代码

是不是因为之前程序里是%d,把0xffffffffffffffff当成负数算了呀,不管是否声明了 signed 还是 unsigned。之后改成%u就是无符号十进制数形式输出。
十分感谢呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-17 15:06:43 | 显示全部楼层
本帖最后由 jackz007 于 2020-1-17 15:09 编辑
Chan歪歪520 发表于 2020-1-17 14:57
sizeof结果是8,修改成了%u结果对啦,不过会有warning

是不是因为之前程序里是%d,把0xffffffffffffff ...


            你把 0xffffffffffffffff 写成 0xffffffffffffffffLL 再试试看,是否还有警告,格式描述符必须不折不扣的写成 %llu ,绝不可以写成 %u,这一点必须注意!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-17 17:22:53 | 显示全部楼层
jackz007 发表于 2020-1-17 15:06
你把 0xffffffffffffffff 写成 0xffffffffffffffffLL 再试试看,是否还有警告,格式描述符 ...

写成0xffffffffffffffffLL就没有警告了,请问是为什么呀?
请问是不是long long 型常量没有严格按照 %llu或者%lld输出,输出会出错呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-17 17:32:47 From FishC Mobile | 显示全部楼层
Chan歪歪520 发表于 2020-1-17 17:22
写成0xffffffffffffffffLL就没有警告了,请问是为什么呀?
请问是不是long long 型常量没有严格按照 %ll ...

        常量会被视为普通整型数,添加LL后缀可以声明为 64 位长整型数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-17 22:15:42 | 显示全部楼层
jackz007 发表于 2020-1-17 17:32
常量会被视为普通整型数,添加LL后缀可以声明为 64 位长整型数。

知道啦!谢谢呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 14:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表