NYOJ 45

 1 // 结果超过了long long,到32就超了 

 2 #include <iostream>

 3 #include <cstring>

 4 using namespace std;

 5 long long fun(int a,int b)

 6 {

 7     //if(0==b)

 8         //return 1;

 9     if(1==b)

10         return a;

11     //本以为会因尽快结束上城循环而加快速度,,谁知执行到return直接跳出函数 

12     long long temp;

13     temp = fun(a,b/2);

14     long long ans = temp*temp;

15     if(b&1)

16         return ans*a;

17     else

18         return ans;

19 }

20 int main()

21 {

22     int i,j,k,T;

23     cin>>T;

24     while(T--)

25     {

26         cin>>k;

27         long long ans = (fun(4,k)-1)/3;

28         cout<<ans<<endl;

29     }

30     return 0;

31 }

32               
#include <iostream>

#include <cstring>

#include <string>

#include <cstdlib>

using namespace std;

int ans[70];

int vis[70];

void fun(int a,int b)

{

    memset(ans,0,sizeof(ans));

    memset(vis,0,sizeof(vis));

    int i,j,k;

    ans[0] = 1;

    for(i=1;i<=b;i++)

    {

        int c = 0;

        for(j=0;j<70;j++)

        {

            int temp = ans[j]*a+c;

            ans[j] = temp%10;

            c = temp/10;

            //if(c==0)//可以算是一个比较大的优化,不仅省去内层无谓的执行,也省去了去掉前导0的时间 

               // break;

        }

    }

    while(ans[j]==0)

        j--;

    /*

    for(i=1;i<=len;i++) 

	{

		a[i]=a[i]-b[i]; 

		if(a[i]<0) 

		{ 

			 a[i+1]--;

             a[i]+=10; 

		} 

	} 

	*/

    ans[0]--;//因为4^n最后一位是4或者6 

    int temp=0,t = 0;

    for(i=j;i>=0;i--)//除以3 

    {

        temp = temp*10 + ans[i];

        vis[t++] = temp/3;//中间不可加上if(temp>=3){temp=0} 

        temp = temp%3;

    }

    int num = 0;

    while(vis[num]==0)//为什么产生前导0,因为如果temp第一次不大于3,就会产生 

        num++;

    for(i=num;i<t;i++)

        cout<<vis[i];

    cout<<endl;

}  

int main()

{

    int i,j,k,T;

    cin>>T;

    while(T--)

    {

        int num;

        cin>>num;

        fun(4,num);

    }

    //system("pause");

    return 0;

}

 

你可能感兴趣的:(OJ)