LoginSignup
6
6

More than 5 years have passed since last update.

面白い数学

Posted at

いや〜、進数変換は出来てるんですが、そこからがうまくいかない。解法が違うのだろうか・・・。全探索が未だに出来ていないという事実に押しつぶされてしまいそうです。(だがくじけない)これはもう、ひたすら全探索解いて頭に刷り込ませるしかないですね!!(白目)最初、ArrayList使えばメモリ節約出来るのでは・・・?と考えましたが、結局最後にint型配列に入れこむという処理が出てくるので、そのままやろうと考えました。ポジティブ思考で行こう!!俺は出来る!俺は出来る!!いけるぞ!!俺!

問題元:SRM150 Div2 Level2

public class Interesting {  

    public static int[] digits(int base) {
        int[] ret = new int[1000];
        for(int r = 1; r < 1000; r++) {
            int sum = 0, num = r;
            while(num != 0) {
                sum += num % base;
                num /= base;
            }
//          System.out.println("sum:" + sum); //DEBUG
            System.out.println("r:" + r + ", sum:" + sum);
            if(sum != 0 && sum != 1) {
                if(r % sum == 0)
                    ret[sum]++;
            }
        }
        return(ret);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final int base = 10;

        int[] ans = digits(base);
        for(int r = 0; r < ans.length; r++) {
            if(ans[r] > 0)
                System.out.print(r + " ");
        }
    }
}


解決策1(4重ループによる全探索)

public static 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++) {
                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) % n != 0) {
                            //nの倍数の数で、各桁の和がnの倍数えなければ、このときのnは除外する
                            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);
    }

解決策2(数式を用いて、処理を減らしたやり方)
数式:
a × n^2 + b × n^1 + c
a × (n - 1)^2 + (b - 2a) × (n - 1) + (a + b + c)
((a × (n - 1) + b - 2a) × (n - 1)) + (a + b + c)

public static int[] digits(int base) {
        Vector<Integer> v = new Vector<Integer>();

        for(int r = 2; r < base; r++) {
            if((base - 1) % r == 0) v.add(r);
        }
        int[] ans = new int[v.size()];
        for(int r = 0; r < v.size(); r++) {
            ans[r] = v.get(r);
        }
        return(ans);
    }
6
6
3

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
6
6