都是要找规律,还有对递归的了解
hd 1995
#include<iostream>
#include<string.h>
using namespace std;
short result[100];
int main(){
int times,plants,no,pow;
cin>>times;
while(times--){
cin>>plants>>no;
pow = plants-no;
memset(result,0,sizeof(result));
result[0]=1;
while(pow--){
for(int i=0;i<100;i++){
result[i]*=2;
}
for(int i=0;i<100;i++){
if(result[i]>=10){
result[i]-=10;
result[i+1]+=1;
}
}
}
int index=99;
while(result[index]==0)
index--;
while(index>=0){
cout<<result[index];
index--;
}
cout<<endl;
}
return 0;
}
用大数还是蛮简单的
hd1996
#include<iostream>
#include<string.h>
using namespace std;
int a[100];
int main()
{
int t;
while(cin>>t&&t){
int n,k;
while(cin>>n){
int w=n;
memset(a,0,sizeof(a));
a[0]=1;
while(w--){
for(int i=0;i<100;i++){
a[i]*=3;
}
//if(w==1) a[0]+=1;
for(int j=0;j<100;j++){
if(a[j]>9){
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
}
}
int y=99;
while(a[y]==0) y--;
for(int i=y;i>=0;i--) cout<<a[i];
cout<<endl;
}
}
return 0;
}
hd2064
#include<stdio.h>
int main()
{
__int64 a[36],i,n;
a[1]=2;
for(i=2;i<=35;i++)
a[i]=a[i-1]*3+2; // 移动关系
while(scanf("%I64d",&n)==1)
{
printf("%I64d\n",a[n-1]);
}
return 0;
}
hd2077
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
long long int s=pow(3, n-1)+1;
cout<<s<<endl;
}
return 0;
}
hd2175
我是看他的 杭电2175C++_轲轲公主的博客-CSDN博客
#include<iostream>
#include<cmath>
using namespace std;
int pan(int n, long long m){
if (n == 1 && m == 1)
return 1;
long long mid = pow(2, n - 1);
if (m == mid)
return n;
else if (m > mid)
return pan(n - 1, m - mid);
else
return pan(n - 1, m);
}
int main(){
int n;
long long m;
while (cin>>n>>m,n||m)
cout << pan(n,m) << endl;
return 0;
}