鱼C论坛

 找回密码
 立即注册
查看: 2392|回复: 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
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

printf的类型为llu
超出定义的变量的长度了,逻辑没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不行呢,好像最大只能32位,是软件问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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位,是软件问题吗


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

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-31 17:05:17 | 显示全部楼层
但是用小甲鱼的代码可以,我这个不行,为什么呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个可以,但是小甲鱼代码的也是整型,可以运行,我写的这个不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-31 18:14:17 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


应该还是取值范围的问题吧。其实我也有点搞不懂了,运算结果应该是18446744073709551616,都是超了范围的,为什么一个显示是0,一个显示是18446744073709551615,应该就是楼上大佬提到的pow运算为double类型导致左右数值类型不一样的问题吧。
想知道小甲鱼最近在做啥?请访问 -> 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的情况呀?

为什么利用中间变量的情况就不会发生这种情况呢?
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-31 05:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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