题目本质就是几何级数,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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复