大数问题
描述
在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求需要类似图2方格总的个数s。如k=1时,s=1;k=2时,s=5
输入
第一行m表示有m组测试数据;
每一组测试数据的第一行有一个整数数k;
输出
输出所需个数s;
样例输入
3
1
2
3
样例输出
1
5
21
来源
《算法设计》题
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
using namespace std;
char ch[105][200]={"0","1"};
int map[200];
void get(int x)
{
int i,j,k;
k=strlen(ch[x-1]);
for(i=0;i<k;i++)
map[i]=ch[x-1][k-i-1]-'0';
}
void sum()
{
int i,j,k,p,q;
for(i=2;i<=100;i++)
{
k=strlen(ch[i-1]);
get(i);
p=1;
for(j=0;j<k;j++)
{
map[j]=map[j]*4+p;
p=map[j]/10;
if(map[k-1]>9)k++;
map[j]=map[j]%10;
}
for(j=0;j<k;j++)
ch[i][j]=map[k-j-1]+'0';
}
}
int main()
{
int i,j,k,m,n;
sum();
cin>>n;
while(n--)
{
cin>>m;
cout<<ch[m]<<endl;
}
return 0;
}