小伊布 发表于 2021-12-31 16:31:11

S1E6课后习题代码求解

#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;
}

村里小黑 发表于 2021-12-31 16:38:18

本帖最后由 村里小黑 于 2021-12-31 16:42 编辑

printf的类型为llu
超出定义的变量的长度了,逻辑没问题

阿萨德按时 发表于 2021-12-31 16:40:26

printf("result = %u\n", result);把这里的%u改成llu就好了https://xxx.ilovefishc.com/forum/202112/09/164943hkpkq7bebk79qkf7.png.thumb.jpg

小伊布 发表于 2021-12-31 16:42:19

阿萨德按时 发表于 2021-12-31 16:40
printf("result = %u\n", result);把这里的%u改成llu就好了

不行呢,好像最大只能32位,是软件问题吗

阿萨德按时 发表于 2021-12-31 16:57:12

本帖最后由 阿萨德按时 于 2021-12-31 17:01 编辑

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

int main()
{
    double result = 0;

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

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

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

还是超出了范围。。改成上面那那样就可以了https://xxx.ilovefishc.com/forum/201512/27/205729vnwzeadn08gx9h89.png

小伊布 发表于 2021-12-31 17:05:17

但是用小甲鱼的代码可以,我这个不行,为什么呢

小伊布 发表于 2021-12-31 17:07:45

阿萨德按时 发表于 2021-12-31 16:57
还是超出了范围。。改成上面那那样就可以了

这个可以,但是小甲鱼代码的也是整型,可以运行,我写的这个不行

傻眼貓咪 发表于 2021-12-31 17:58:41

本帖最后由 傻眼貓咪 于 2021-12-31 18:14 编辑

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

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

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

    return 0;
}方法 2:位元 XOR 运算符#include <stdio.h>
#include <math.h>

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

    return 0;
}方法 3:位元 OR 运算符#include <stdio.h>
#include <math.h>

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

    return 0;
}方法 4:数学公式 - 二次方运算
#include <stdio.h>
#include <math.h>

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

    return 0;
}

小伊布 发表于 2021-12-31 18:14:17

谢谢

阿萨德按时 发表于 2022-1-4 08:43:35

本帖最后由 阿萨德按时 于 2022-1-4 09:24 编辑

小伊布 发表于 2021-12-31 17:07
这个可以,但是小甲鱼代码的也是整型,可以运行,我写的这个不行

应该还是取值范围的问题吧。其实我也有点搞不懂了,运算结果应该是18446744073709551616,都是超了范围的,为什么一个显示是0,一个显示是18446744073709551615,应该就是楼上大佬提到的pow运算为double类型导致左右数值类型不一样的问题吧。

wsym6885986 发表于 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的情况呀?

为什么利用中间变量的情况就不会发生这种情况呢?#include <stdio.h>
#include <math.h>
int main(){
        unsigned long long sum = 0;
        unsigned long long n = 0;
        unsigned long long temp = 0;
        int i;
        int k = 0;
        for(i = 0;i<64; i++ ){
                sum += pow(2,i);
                temp = pow(2,i);
                n = n + temp;
                if(i == 52){
                        printf("i = %d\n",i);
                        printf("n = %llu\n",n);
                        printf("sum = %llu\n",sum);       
                        printf("temp = %llu\n",temp);
                }
                if(sum != n && k == 0){
                        k = 1;
                        printf("i = %d\n",i);
                        printf("n = %llu\n",n);
                        printf("sum = %llu\n",sum);       
                        printf("temp = %llu\n",temp);
                               
                }

               
        }
       
        printf("一共应给予%llu粒麦子\n",sum);
        printf("共%llu公斤麦子\n",sum/25000);
        return 0;
}
页: [1]
查看完整版本: S1E6课后习题代码求解