鱼C论坛

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

[已解决]S1E6课后习题代码求解

[复制链接]
发表于 2021-12-31 16:31:11 | 显示全部楼层 |阅读模式

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

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

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

int main()
{
    unsigned long long result = 0;

    for(int i=0; i<64; i++){
        result += pow(2, i);
    }

    printf("result = %u\n", result);

    return 0;
}

XZ16`S(W3[8TG5I[2_[V735.png
最佳答案
2021-12-31 17:58:41
本帖最后由 傻眼貓咪 于 2021-12-31 18:14 编辑

方法 1
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main(){
  4.     unsigned long long result = 0;

  5.     for(int i = 0; i < 64; i++){
  6.         result += (unsigned long long)pow(2, i); // 注:pow() 返回 double 类型,需要转换成 unsigned long long 类型
  7.     }
  8.     printf("result = %llu\n", result); // 注:输出类型必须也是 unsigned long long 类型 %llu(此外,在广泛使用 ISO C99 扩展之前,用 %I64u 于 Win32/Win64 平台)

  9.     return 0;
  10. }
复制代码
方法 2:位元 XOR 运算符
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long result = 1LL;
  6.     for(unsigned long long i = 0; i < 64; i++) result ^= 2LL<<i;
  7.     printf("result: %llu\n", result);

  8.     return 0;
  9. }
复制代码
方法 3:位元 OR 运算符
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long result = 0;
  6.     for(unsigned long long i = 0; i < 64; i++) result |= 1LL<<i;
  7.     printf("result: %llu\n", result);

  8.     return 0;
  9. }
复制代码
方法 4:数学公式 - 二次方运算

数学公式

数学公式
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long result = (unsigned long long)(pow(2, 64)-1);
  6.     printf("result: %llu", result);

  7.     return 0;
  8. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-31 16:38:18 | 显示全部楼层
本帖最后由 村里小黑 于 2021-12-31 16:42 编辑

printf的类型为llu
超出定义的变量的长度了,逻辑没问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-31 16:40:26 | 显示全部楼层
printf("result = %u\n", result);把这里的%u改成llu就好了

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-31 16:42:19 | 显示全部楼层
阿萨德按时 发表于 2021-12-31 16:40
printf("result = %u\n", result);把这里的%u改成llu就好了

不行呢,好像最大只能32位,是软件问题吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-31 16:57:12 | 显示全部楼层
本帖最后由 阿萨德按时 于 2021-12-31 17:01 编辑
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     double result = 0;

  6.     for(int i=0; i<64; i++){
  7.         result += pow(2, i);
  8.     }

  9.     printf("result = %f\n", result);

  10.     return 0;
  11. }
复制代码
小伊布 发表于 2021-12-31 16:42
不行呢,好像最大只能32位,是软件问题吗


还是超出了范围。。改成上面那那样就可以了

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-31 17:05:17 | 显示全部楼层
但是用小甲鱼的代码可以,我这个不行,为什么呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-31 17:07:45 | 显示全部楼层
阿萨德按时 发表于 2021-12-31 16:57
还是超出了范围。。改成上面那那样就可以了

这个可以,但是小甲鱼代码的也是整型,可以运行,我写的这个不行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-31 17:58:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2021-12-31 18:14 编辑

方法 1
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main(){
  4.     unsigned long long result = 0;

  5.     for(int i = 0; i < 64; i++){
  6.         result += (unsigned long long)pow(2, i); // 注:pow() 返回 double 类型,需要转换成 unsigned long long 类型
  7.     }
  8.     printf("result = %llu\n", result); // 注:输出类型必须也是 unsigned long long 类型 %llu(此外,在广泛使用 ISO C99 扩展之前,用 %I64u 于 Win32/Win64 平台)

  9.     return 0;
  10. }
复制代码
方法 2:位元 XOR 运算符
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long result = 1LL;
  6.     for(unsigned long long i = 0; i < 64; i++) result ^= 2LL<<i;
  7.     printf("result: %llu\n", result);

  8.     return 0;
  9. }
复制代码
方法 3:位元 OR 运算符
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long result = 0;
  6.     for(unsigned long long i = 0; i < 64; i++) result |= 1LL<<i;
  7.     printf("result: %llu\n", result);

  8.     return 0;
  9. }
复制代码
方法 4:数学公式 - 二次方运算

数学公式

数学公式
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long result = (unsigned long long)(pow(2, 64)-1);
  6.     printf("result: %llu", result);

  7.     return 0;
  8. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-31 18:14:17 | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-1-4 08:43:35 | 显示全部楼层
本帖最后由 阿萨德按时 于 2022-1-4 09:24 编辑
小伊布 发表于 2021-12-31 17:07
这个可以,但是小甲鱼代码的也是整型,可以运行,我写的这个不行


应该还是取值范围的问题吧。其实我也有点搞不懂了,运算结果应该是18446744073709551616,都是超了范围的,为什么一个显示是0,一个显示是18446744073709551615,应该就是楼上大佬提到的pow运算为double类型导致左右数值类型不一样的问题吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-12 21:36:32 | 显示全部楼层
傻眼貓咪 发表于 2021-12-31 17:58
方法 1方法 2:位元 XOR 运算符方法 3:位元 OR 运算符方法 4:数学公式 - 二次方运算

还是S1E6这个题目,请问 pow(2,i) 里面没有小数,即便是double类型,为什么在 i = 53 时,出现了计算多出1的情况呀?

为什么利用中间变量的情况就不会发生这种情况呢?
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(){
  4.         unsigned long long sum = 0;
  5.         unsigned long long n = 0;
  6.         unsigned long long temp = 0;
  7.         int i;
  8.         int k = 0;
  9.         for(i = 0;i<64; i++ ){
  10.                 sum += pow(2,i);
  11.                 temp = pow(2,i);
  12.                 n = n + temp;
  13.                 if(i == 52){
  14.                         printf("i = %d\n",i);
  15.                         printf("n = %llu\n",n);
  16.                         printf("sum = %llu\n",sum);       
  17.                         printf("temp = %llu\n",temp);
  18.                 }
  19.                 if(sum != n && k == 0){
  20.                         k = 1;
  21.                         printf("i = %d\n",i);
  22.                         printf("n = %llu\n",n);
  23.                         printf("sum = %llu\n",sum);       
  24.                         printf("temp = %llu\n",temp);
  25.                                
  26.                 }

  27.                
  28.         }
  29.        
  30.         printf("一共应给予%llu粒麦子\n",sum);
  31.         printf("共%llu公斤麦子\n",sum/25000);
  32.         return 0;
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 09:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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