【题目来源】
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

 

更多推荐