NYOJ 45( 分治,大数)

试题链接
分治的方法:http://blog.csdn.net/acm_JL/article/details/50938164

根据分治的思想可以推导出递推式:f(k)=4*f(k-1)+1,且f(1)=1;
可知需要用到大数乘法和加法。


#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int a[101][100];
    memset(a,0,sizeof(a));
    int tail=0;  //指向最高位的索引
    int value;
    int carry=0;
    a[1][0]=1;
    for(int i=2; i<=100; i++)
    {
        for(int j=0; j<=tail; j++)   //大数乘法 f(k-1)*4
        {
            value=a[i-1][j]*4+carry;
            a[i][j]=value%10;
            carry=value/10;
            if(j==tail&&carry!=0)
                tail++;
        }//从此循环出来时carry一定为0

        a[i][0]++;        //加 1 操作
        for(int n=0; n<=tail; n++)
        {

            if(a[i][n]<=9)
                break;
            else
            {
                value=a[i][n]+carry;
                a[i][n]=value%10;
                carry=1;  //因为是加1操作,只可能进1位
            }
            if(n==tail&&carry!=0)
                tail++;
        }
    }
    //输出
    int cnt,k;
    cin>>cnt;
    while(cnt--)
    {
        cin>>k;
        if(k==1)
        {
            cout<<1<<endl;
            continue;
        }
        int i=99;
        while(a[k][i]==0)
            i--;
        for(int j=i; j>=0; j--)
            cout<<a[k][j];
        cout<<endl;
    }
    return 0;
}


优化:
1.可以用一维数组去替代二维数组

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    int a[100];  //用一维数组去代替二维数组,优化空间复杂度
	int n;
	cin>>n;
	while(n--)
    {
        memset(a,0,sizeof(a));
        int k;
        cin>>k;
        if(k==1)
        {
            cout<<1<<endl;
            continue;
        }
        a[0]=1;

        int tail=0;  //指向最高位的索引
        int carry=0;

        for(int i=2; i<=k; i++ )
        {
            for(int j=0; j<=tail; j++)
            {
                a[j]=a[j]*4+carry;
                if(j==0)
                    a[j]++;
                carry=a[j]/10;
                a[j]=a[j]%10;

                if(j==tail&&carry!=0)
                    tail++;
            }//从此循环出来时carry一定为0
        }

        for(int i=tail; i>=0; i--)
            cout<<a[i];
        cout<<endl;

    }
	return 0;
}

原文地址:https://www.cnblogs.com/zhanyeye/p/9746095.html