LoginSignup
3
3

More than 5 years have passed since last update.

おもしろい数学2

Last updated at Posted at 2014-06-21

 う〜ん・・・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文の中に条件を入れてしまえば、見やすくなります。一応、自分が参考している書籍に準拠して書きました。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3