题目本质就是几何级数,C语言还是任何语言可以用64无符号位整数表示


计算几何级数:2⁰ + 2¹ + 2² + ... + 2⁶³

二进制角度的理解

从二进制角度看:

1 << 0 = 1 (二进制: 0000...0001)

1 << 1 = 2 (二进制: 0000...0010)

1 << 2 = 4 (二进制: 0000...0100)

...

1 << 63 (二进制: 第63位为1)

当把这些数相加时,每个二进制位都会被设置为1,结果就是64位全为1:1111111111111111111111111111111111111111111111111111111111111111

数学公式优化

几何级数求和公式:S = a(rⁿ-1)/(r-1)

a = 1, r = 2, n = 64

S = (2⁶⁴ - 1) / 1 = 2⁶⁴ - 1


如Python

# 方法1: 直接计算

result = (1 << 64) - 1

print(result)


# 方法2: 位运算技巧

result = (1 << 64) - 1

print(result)


# 方法3: 如果用固定64位,也可以写成

result = 0xFFFFFFFFFFFFFFFF  # 16个F,每个F代表4个1

print(result)


或者C语言

#include <stdio.h>

#include <stdint.h>


int main() {

    // 2^64 - 1,但要避免 (1ULL << 64) 的未定义行为

    uint64_t result = UINT64_MAX;  // 等价于 2^64 - 1

    printf("%llu\n", result);

    

    // 或者用十六进制表示

    uint64_t result2 = 0xFFFFFFFFFFFFFFFFULL;

    printf("%llu\n", result2);

    

   // 利用 ~0ULL 表示全1,然后右移    u

   int64_t result = ~0ULL;  

    printf("%llu\n", result);

    return 0;

}

C语言注意:

数据类型:使用 uint64_t 或 unsigned long long 处理64位无符号整数

避免未定义行为:(1ULL << 64) 是未定义的,要用其他方式表示

性能对比:直接计算 O(1) vs 循环 O(64)

可读性:UINT64_MAX 或 ~0ULL 更清楚地表达了"全1"的含义


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论