lanqiaoOJ 739:棋盘放麦子 ← #define int __int128
【题目来源】
https://www.lanqiao.cn/problems/739/learning/
【题目描述】
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子,在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子,在第 4 个棋盘格放 8 粒麦子,.…...后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 64 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
【算法分析】
● 解法一可用 unsigned long long 实现。详见:https://blog.csdn.net/hnjzsyjyj/article/details/148811713
unsigned long long 是 C/C++ 中用于存储超大非负整数的数据类型,可表示 0 到 2^64-1(即 0~18,446,744,073,709,551,615)的非负整数。而 long long 的表示范围为 0 到 2^63-1(即 0~9,223,372,036,854,775,807)的非负整数。
● 解法二可用 #define int __int128 实现。__int128 是一种非标准的 128 位整数数据类型,不属于 C/C++ 标准,是 GCC/G++ 等编译器提供的扩展类型。详见:https://blog.csdn.net/hnjzsyjyj/article/details/148136064
使用 #define int __int128 将代码中所有的 int 类型替换为 __int128 类型后,需配合 signed main(){ } 使用,以避免使用 int main(){ } 时导致返回值类型错误。
特别需要注意的是,__int128 类型无标准 I/O 支持,无法直接使用 cin / cout / scanf / printf,需手动实现读写函数。
int read() { //fast read
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9') { //!isdigit(c)
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9') { //isdigit(c)
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void print(int x) {
if(x<0) putchar('-'), x=-x;
if(x>9) print(x/10);
putchar(x%10+'0');
}
【算法代码】
#include <bits/stdc++.h>
#define int __int128
using namespace std;
void print(int x) {
if(x<0) putchar('-'), x=-x;
if(x>9) print(x/10);
putchar(x%10+'0');
}
signed main() {
int sum=0,t=1;
for(int i=0; i<64; i++) {
sum+=t;
t*=2;
}
print(sum);
}
/*
18446744073709551615
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/148811713
https://blog.csdn.net/hnjzsyjyj/article/details/148136064
更多推荐




所有评论(0)