题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子,在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子,在第 4 个棋盘格放8 粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 64 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
【思路】运用高精度乘法计算出每个棋盘放的麦子数,再用高精度加法计算出麦子的总和
【代码及注释】
#include<bits/stdc++.h>
using namespace std;
vector<int> A,D;
vector<int> mul(vector<int> a,int b)
{
vector<int> c;
int t=0;
for(int i=0;i<a.size();i++)
{
t=t+a[i]*b;
c.push_back(t%10);
t/=10;
}
if(t) c.push_back(t);
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
vector<int> add(vector<int> &A,vector<int> &B)
{
if(A.size()<B.size()) return add(B,A);
//长的放在A的位置
vector<int> c;
int t=0;
for(int i=0;i<A.size();i++)
{
t+=A[i];
if(i<B.size()) t+=B[i];
c.push_back(t%10);
t/=10;
}
if(t)
c.push_back(1);
return c;
}
int main()
{
A.push_back(1);
D.push_back(1);
for(int i=2;i<=64;i++)
{
auto c=mul(A,2);
D=add(D,c);
A=c;
}
reverse(D.begin(),D.end());
for(int i=0;i<D.size();i++)
cout<<D[i];
return 0;
}
【答案】
18446744073709551615