う〜ん・・・10進数から必ず始まるという思い込みが招いた結果だと思われます。どうも変換して・・・という風にやっていたのですが、桁に分けなくてはいけないと気付き、この方法では破綻するとおもって中断して、解答を確認してコーディングしました。
import java.util.*;
public class Main {
//詰まってしまった解答
//途中で明らかに問題を全探索で解く方式ではない方法で、答えが出なさそうなコードだったので中断
// boolean ok(int num, int base) {
// int sum = 0;
// int temp = num;
// while(temp != 0) {
// sum += temp % base;
// temp /= base;
// }
// return(sum % num == 0);
// }
//
// int toDigit(int a, int b, int c) {
// return(a * 100 + b * 10 + c);
// }
//
// int[] digits(int base) {
// TreeSet<Integer> list = new TreeSet<Integer>();
// for(int r = 0; r < 10; r++) {
// for(int c = 0; c < 10; c++) {
// for(int k = 0; k < 10; k++) {
// int digit = toDigit(r, c, k);
// if(ok(digit, base)) {
//
// }
// }
// }
// }
// }
// int[] digits(int base) {
// ArrayList<Integer> v = new ArrayList<Integer>();
//
// for(int n = 2; n < base; n++) {
// boolean ok = true;
// for(int k1 = 0; k1 < base; k1++) {//1桁目
// for(int k2 = 0; k2 < base; k2++) {//2桁目
// for(int k3 = 0; k3 < base; k3++) {//3桁目
// if((k1 + k2*base + k3*base*base) % n == 0 && (k1 + k2 + k3) % n != 0) {
// ok = false;
// break;
// }
// }
// if(!ok) break;
// }
// if(!ok) break;
// }
// if(ok) v.add(n);
// }
// int[] ans = new int[v.size()];
// for(int r = 0; r < v.size(); r++) {
// ans[r] = v.get(r);
// }
// return(ans);
// }
//中断し、解答を見て、自分で解答を見ずに書いてみたコード
int[] digits(int base) {
ArrayList<Integer> list = new ArrayList<Integer>();
for(int n = 2; n < base; n++) {
boolean ok = true;
for(int k1 = 0; k1 < base; k1++) { //ここに条件を含む方法もある
for(int k2 = 0; k2 < base; k2++) {
for(int k3 = 0; k3 < base; k3++) {
//当てはまらない
if(k1 + k2 * base + k3 * base * base % n == 0 && k1 + k2 + k3 % 2 != 0) {
ok = false;
break;
}
}
if(!ok) break;
}
if(!ok) break;
}
if(ok) list.add(n);
}
int[] ret = new int[list.size()];
for(int r = 0; r < ret.length; r++) {
ret[r] = list.get(r);
}
return(ret);
}
void doIt() {
int[] ans = digits(3);
for(int r = 0; r < ans.length; r++) {
System.out.print(ans[r] + " ");
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Main().doIt();
}
}
実はこの問題、解答を見た後に上述の思い込みによって理解出来ませんでした。とりあえず保留していたのですが、今回まで響いてしまい、このまま理解出来ずはマズいとおもった上での中断です。
本当は中断しちゃいけないんですけどね・・・。あと、for文の中に条件を入れてしまえば、見やすくなります。一応、自分が参考している書籍に準拠して書きました。