棋盤覆蓋
時間限制:3000 ms | 內存限制:65535 KB
題目鏈接 :http://acm.nyist.net/JudgeOnline/problem.php?pid=45 點擊打開鏈接
輸入
第一行m表示有m組測試數據;
每一組測試數據的第一行有一個整數數k; 輸出 輸出所需個數s; 樣例輸入
每一組測試數據的第一行有一個整數數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;
}