大数,递推
第一种
#include<iostream>
#include <cstring>
using namespace std;
int res[110];//存放中间结果,可能很大
int main(){
int m;
scanf("%d",&m);
while(m--){
memset(res,0,sizeof(res));
int k;
scanf("%d",&k);
if(k==1){printf("1\n");continue;}
res[0]=1;
int p=0;//指示使用了数组的那些位
int c=0;//进位
for(int i=1;i<k;i++){
c=0;
for(int j=0;j<=p;j++){
res[j]=res[j]*4+c;
c=res[j]/10;
res[j]%=10;
}
if(c>0)res[++p]=c;
res[0]++;
}
// for(int i=p;i>=0;i--)printf("%d",res[i]);
while(p!=-1)printf("%d",res[p]),p--;
printf("\n");
}
}
第二种,不在手动数组而是改使用vector
/*
-------------------------------------------------
Author : yrk
date: 2018/12/14 13:34
Description :
-------------------------------------------------
*/
#include<iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;
int m;
cin>>m;
while(m--){
a.clear();
int k;
cin>>k;
if(k==1){cout<<k<<endl;continue;}
int c=0;
a.push_back(1);
for(int i=1;i<k;i++){
c=0;
for(int j=0;j<a.size();j++){
a[j]=a[j]*4+c;
c=a[j]/10;
a[j]%=10;
}
if(c)a.push_back(c);
a[0]++;
}
for(int i=a.size()-1;i>=0;i--)cout<<a[i];
cout<<endl;
}
}
第三种,用一个int位存储8位数据而不是一位
/*
-------------------------------------------------
Author : yrk
date: 2018/12/14 13:34
Description :
-------------------------------------------------
*/
#include<iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;
int m;
cin>>m;
while(m--){
a.clear();
int k;
cin>>k;
if(k==1){cout<<k<<endl;continue;}
int c=0;
a.push_back(1);
for(int i=1;i<k;i++){
c=0;
for(int j=0;j<a.size();j++){
a[j]=a[j]*4+c;
c=a[j]/100000000;
a[j]%=100000000;
}
if(c)a.push_back(c);
a[0]++;
}
cout<<a[a.size()-1];//这是最后的进位,可能没有8位,需要单独处理
for(int i=a.size()-2;i>=0;i--)printf("%08d",a[i]);
cout<<endl;
}
}