3025這個4位數相當特別。如果你把他從中間切開你會得到2個長度相同的數30,25。而且此2數和的平方恰等於原來的數,我們稱這種數為quirksome number。
(30+25)2=3025
這個問題是:給你N位數(N=2,4,6,8),要找出符合以上性質的所有數。
For example:4位數就是從0000到9999。注意:數字前方的0也要算在內。也就是說0001等於 (00+01)2 ,是一個4位數的quirksome number。
輸入說明 :
輸入可能包含了好幾列測試資料,每一列只有一個數字N(N=2,4,6,8),代表要求的是幾位數的quirksome number。
輸出說明 :
對每一個輸入N,你應該要輸出所有N位數的quirksome number,每個一行,由小到大排列。注意:數字前方的0不可忽略,例如2位數中的quirksome number 01不可只輸出1。
範例輸入 :
2
2
範例輸出 :
00
01
81
00
01
81
出處 :
ACM 256 (管理:liouzhou_101)
程式碼 :
#include<stdio.h> int main() { int i,j,n,ans[4][10],point[4],ij,temp,loop; point[0] = 3; ans[0][0] = 0; ans[0][1] = 1; ans[0][2] = 81; for(i=1; i<4; i++) point[i] = 0; for(n=100,loop=1; loop<4; loop++) { for(i=0; i<n; i++) for(j=0; j<n; j++) { ij = (i+j) * (i+j) ; temp = i*n + j; if(ij == temp) ans[loop][point[loop]++] = temp; else if(ij > temp) break; } n = n * 10; } while(scanf("%d",&n)==1) { switch(n) { case 2: n = n/2 - 1; for(i=0; i<point[0]; i++) printf("%02d\n",ans[n][i]); break; case 4: n = n/2 - 1; for(i=0; i<point[1]; i++) printf("%04d\n",ans[n][i]); break; case 6: n = n/2 - 1; for(i=0; i<point[2]; i++) printf("%06d\n",ans[n][i]); break; case 8: n = n/2 - 1; for(i=0; i<point[3]; i++) printf("%08d\n",ans[n][i]); break; } } return 0; }
http://zerojudge.tw/ShowProblem?problemid=d182
沒有留言:
張貼留言