アプリ版:「スタンプのみでお礼する」機能のリリースについて

方眼紙に数値を0からN字に並べた場合のX番目、Y番目の
値を求める式を考えています。何か法則がありそうです
がまだ、見つけることが出来ません。

┼─┼─┼─┼─┼─┼─┼─┼─┼
│21│23│29│31│53│55│61│63│
┼─┼─┼─┼─┼─┼─┼─┼─┼
│20│22│28│30│52│54│60│62│
┼─┼─┼─┼─┼─┼─┼─┼─┼
│17│19│25│27│49│51│57│59│
┼─┼─┼─┼─┼─┼─┼─┼─┼
│16│18│24│26│48│50│56│58│
┼─┼─┼─┼─┼─┼─┼─┼─┼
│5 │7 │13│15│37│39│45│47│
┼─┼─┼─┼─┼─┼─┼─┼─┼
│4 │6 │12│14│36│38│44│46│
┼─┼─┼─┼─┼─┼─┼─┼─┼
│1 │3 │9 │11│33│35│41│43│
┼─┼─┼─┼─┼─┼─┼─┼─┼
│0 │2 │8 │10│32│34│40│42│
┼─┼─┼─┼─┼─┼─┼─┼─┼

誰がお分かりでしたら、お教え願いたいのですが・・・

Ans=(X,Y)として
0=(1,1)
8=(3,1)
38=(6,3)
63=(8,8)

以上、よろしくお願い致します。m(__)m

A 回答 (7件)

x,y>1のとき、(x,y)=(x,1)+(1,Y)


(x,1)=(1,x)*2
(1,y)=(1,y-1)+1 Yが偶数
(1,y)=(y,1)*2 Yが奇数
では?
    • good
    • 0

魔法陣のようです


隣り合う4つの数字の、対角の合計がそれぞれ等しい。
    • good
    • 0

例えば8×8の魔方陣であれば、


8×8の升目を書いて、4×4の升目のブロックで対角線を引いて、その対角線上の数字をとばして、数字を埋めて行きます。
┏━┳━┳━┳━┳━┳━┳━┳━┓
┃\┃2┃3┃/┃\┃6┃7┃/┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃9┃\┃/┃12┃13┃\┃/┃16┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃17┃/┃\┃20┃21┃/┃\┃24┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃/┃26┃27┃\┃/┃30┃31┃\┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃\┃34┃35┃/┃\┃38┃39┃/┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃41┃\┃/┃44┃45┃\┃/┃48┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃49┃/┃\┃52┃53┃/┃\┃56┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃/┃58┃59┃\┃/┃62┃63┃\┃
┗━┻━┻━┻━┻━┻━┻━┻━┛
上記の様に埋め終わったら、対角線上に埋められなかった数字を逆から埋めていきます。
┏━┳━┳━┳━┳━┳━┳━┳━┓
┃64┃2┃3┃61┃60┃6┃7┃57┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃9┃55┃54┃12┃13┃51┃50┃16┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃17┃47┃46┃20┃21┃43┃42┃24┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃40┃26┃27┃37┃36┃30┃31┃33┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃32┃34┃35┃29┃28┃38┃39┃25┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃41┃23┃22┃44┃45┃19┃18┃48┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃49┃15┃14┃52┃53┃11┃10┃56┃
┣━╋━╋━╋━╋━╋━╋━╋━┫
┃8┃58┃59┃5┃4┃62┃63┃1┃
┗━┻━┻━┻━┻━┻━┻━┻━┛
これで魔方陣の完成です。
魔方陣であれば、この表の様に縦横斜めどこの合計も等しいです。

では、本題に入りましょう。

左下からスタートし上へいって、右下へ斜めに上と
N字に進むルールになっています。
このルールに従って数字を順番に埋めているだけです。
    • good
    • 0

No.3で回答を書き忘れました。



XとYを使ってAnsの値を求めれば良いのですね。

Ans=(X,Y)=int(X/4)*32+int(Y/4)*16+int(X/2)*8+int(Y/2)*4

でいかがですか。
int(xxx)はxxxが小数であっても小数点以下を切り捨てという意味に取ってください。
    • good
    • 0

No.4の回答は間違いでしたので無視して下さい。


わかり次第再回答します。
    • good
    • 0

Ans=(X,Y)



=(X-1)*2+int((X-1)/2)*4+int((X-1)/4)*16+Y-1+int((Y-1)/2)*2+int((Y-1)/4)*8

=X*2-2+int((X-1)/2)*4+int((X-1)/4)*16+Y-1+int((Y-1)/2)*2+int((Y-1)/4)*8

=X*2+int((X-1)/2)*4+int((X-1)/4)*16+Y+int((Y-1)/2)*2+int((Y-1)/4)*8-3

もう少し、簡単になるかなぁ。
    • good
    • 0

intでは数学っぽく無いのでガウス記号[]を使いますね。



Ans=(X,Y)=X*2+[(X-1)/2]*4+[(X-1)/4]*16+Y+[(Y-1)/2]*2+[(Y-1)/4]*8-3

この回答への補足

こんな感じでいけました。

llAns = 0;
/* X方向計算 */
llAns = Xpos * 2;
for (i = 1;; i++){
llong llWork;
llWork = (long)(Xpos - 1) / (long)pow(2, i) * 2 * (long)pow(2, i * 2);
if (llWork > 0){
llAns += llWork;
}
else{
break;
}
}
/* Y方向計算 */
llAns += Ypos;
for (i = 1;; i++){
llong llWork;
llWork = (long)((Ypos - 1) / (long)pow(2, i)) * 2 * (long)pow(2, i * 2 - 1);
if (llWork > 0){
llAns += llWork;
}
else{
break;
}
}
llAns -= 3;

補足日時:2004/01/20 09:36
    • good
    • 0
この回答へのお礼

上記の関数を作ったところ、うまくいけました。
実はまだ書ききれなかったため省略していたのですが、

85 87 93 95 117 119 125 127 213 215 221 223 245 247 253 255
84 86 92 94 116 118 124 126 212 214 220 222 244 246 252 254
81 83 89 91 113 115 121 123 209 211 217 219 241 243 249 251
80 82 88 90 112 114 120 122 208 210 216 218 240 242 248 250
69 71 77 79 101 103 109 111 197 199 205 207 229 231 237 239
68 70 76 78 100 102 108 110 196 198 204 206 228 230 236 238
65 67 73 75 97 99 105 107 193 195 201 203 225 227 233 235
64 66 72 74 96 98 104 106 192 194 200 202 224 226 232 234
21 23 29 31 53 55 61 63 149 151 157 159 181 183 189 191
20 22 28 30 52 54 60 62 148 150 156 158 180 182 188 190
17 19 25 27 49 51 57 59 145 147 153 155 177 179 185 187
16 18 24 26 48 50 56 58 144 146 152 154 176 178 184 186
5 7 13 15 37 39 45 47 133 135 141 143 165 167 173 175
4 6 12 14 36 38 44 46 132 134 140 142 164 166 172 174
1 3 9 11 33 35 41 43 129 131 137 139 161 163 169 171
0 2 8 10 32 34 40 42 128 130 136 138 160 162 168 170

っていう感じで、最大X=40000、Y=40000ぐらいまで
計算する必要があります。
多分、乗数で計算する必要があると思いますが、ちょっと
これを参考に考えて見ます。

お礼日時:2004/01/19 10:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!