NYIT 45 棋盤覆蓋

                                                          棋盤覆蓋

時間限制:3000 ms  |  內存限制:65535 KB



 題目鏈接 :http://acm.nyist.net/JudgeOnline/problem.php?pid=45 點擊打開鏈接

輸入 第一行m表示有m組測試數據;
每一組測試數據的第一行有一個整數數k; 輸出 輸出所需個數s; 樣例輸入
3
1
2
3
樣例輸出
1
5
21


無可否認大數問題離不了數組,這道題本意就是求4的k次方是3的幾倍。但4的k次方可能很大,所以要用到數組,因爲不知道是幾次,所以用二維數組來存儲各個次方所得的數,然後再把每一維的數除3,代碼如下:

#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,i,j,k,t;
    int ans[101][61];
    memset(ans,0,sizeof(ans));
    ans[1][0]=4; //4的一次方
    for(i=2; i<101; i++) //二維數組,可以保存任意n時,4的n次方所得的結果,也就是所有的小方格數
    {
        k=0;
        for(j=0; j<61; j++)
        {
            t=ans[i-1][j]*4+k;
            ans[i][j]=t%10;
            k=t/10;
        }
    }

    for(i=1; i<101; i++)  //計算不同i時,要求的方格數
    {
        j=60;
        while(ans[i][j] == 0) //找到數字的首位,排除前導0
        {
            j--;
        }
        k=0;   //k代表上一位除以3後的餘數
        for(; j>=0; j--)  //數字要正排序進行除法
        {
            t=ans[i][j]+k*10;
            ans[i][j]=t/3;
            k=t%3;
        }
    }
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        j=60;
        while(ans[m][j] == 0)//排除前導0
            j--;

        while(j>=0)
        {
             printf("%d",ans[m][j--]);
        }
         printf("\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章