代码有点长,但肯定对。
这道题跟1280. 求2的n次方差不多。
只要把求2的n次方主程序里的r="2"改成r="1"就好了。
问题描述
传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏 ,陛下,只要你在我的棋盘上赏一些麦子就行了。
在棋盘的第 1 个格子里放 1 粒,在第 2 个格子里放2 粒,在第 3 个格子里放 4 粒,在第 4 个格子里放 8 粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的 2 倍,直到放满第 64 个格子就行了”。
“区区小数,几粒麦子,这有何难,来人”,国王令人如数付给西塔。
计数麦粒的工作开始了,第一格内放 1 粒,第二格内放 2 粒第三格内放 4粒,…… 还没有到第二十格,一袋麦子已经空了。
一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格飞快增长着,国王很快就看出,即便拿出全国的粮食,也兑现不了他对西塔的诺言。
请你编程帮助国王计算出,第 n 个棋盘格子中需要放多少粒麦子?
输入
一个整数 n 代表第 n 格棋盘(n≤100 )
输出
一个整数,代表第 n 格棋盘中麦子的总数。
样例
输入
3
输出
4
编辑代码
语言 C++
代码:
#include <bits/stdc++.h>
#include<string>
#include<algorithm>
using namespace std;
string ch(string r,int q){
int t=0,i,j,d,a[32767]={},b[32767]={},c[32767]={},e[32767]={};
int l,l1;
string s,s1,result;
s = r;
s1 = to_string(q);
l=s.size();
l1=s1.size();
for(i=0;i<=l-1;i++){
a[i]=s[l-1-i]-'0';
}
for(i=0;i<=l1-1;i++){
b[i]=s1[l1-1-i]-'0';
}
for(i=0;i<=l-1;i++){
for(j=0;j<=l1-1;j++){
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]=c[i+j]%10;
}
}
d=l+l1;
for(i=d;i>=0;i--){
if(c[i]==0&&d>=1){
d--;
}
else{
break;
}
}
for(i=d;i>=0;i--){
result+=char(c[i]+'0');
}
return result;
}
int main(){
int i,n;
string r;
r="1";
cin>>n;
for(i=2;i<=n;i++){
r=ch(r,i);
}
cout<<r;
}
to_string如果错了那是应用的问题。