Comment detail

分数を小数に展開 (Nested Flatten)
Java1.6(1.5+?)です。
1<=a<b<2^32-1って条件は無視しちゃいました、a=int & b=int & b!=0 なら…
…故に?長くなっててすみません(汗
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
 * 
 * @param dividend (a) 被除数
 * @param divisor (b) 除数
 * @return 商
 */
public static String getResult(final int dividend, final int divisor) {
    return generateResultString(getDigits(dividend, divisor));
}

private static List<Integer> getDigits(final int dividend, final int divisor) {

    final List<Integer> dividends = new LinkedList<Integer>();
    final List<Integer> digits = new LinkedList<Integer>();

    getDigits(dividend, divisor, digits, dividends);
    return digits;
}

private static void getDigits(final int dividend, final int divisor,
        final List<Integer> digits, final List<Integer> dividends) {

    final int containedIndex = dividends.indexOf(Integer.valueOf(dividend));
    if (containedIndex >= 0) {
        digits.add(Integer.valueOf(containedIndex - digits.size()));
        return;
    }

    digits.add(Integer.valueOf(dividend / divisor));

    final int remainder = dividend % divisor;
    if (remainder != 0) {
        dividends.add(Integer.valueOf(dividend));
        getDigits(remainder * 10, divisor, digits, dividends);

    }
}

private static String generateResultString(final List<Integer> digits) {
    
    final StringBuilder sb = new StringBuilder();
    assert digits.size() > 0;
    sb.append(digits.get(0));
    
    if (digits.size() > 1) {
        sb.append(".");
        for (final Iterator<Integer> itr = digits.listIterator(1); itr.hasNext();) {
            final int digit = itr.next().intValue();
            if (digit >= 0) {
                sb.append(digit);
            } else {
                sb.insert(sb.length() + digit, "{");
                sb.append("}");
            }
        }
    }
    return sb.toString();
}
バグ混在…a=10,b=17を与えたときに
"0.{14084507042253521126760563380281690}"となるべきところが
"0{.1408450704225352112676056338028169}"に…

整数部から循環?してる場合に再現…といっても他の例がないので何とも言えないけど、とりあえず応急措置を…
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private static String generateResultString(final List<Integer> digits) {

    final StringBuilder sb = new StringBuilder();
    assert digits.size() > 0;
    sb.append(digits.get(0));

    if (digits.size() > 1) {
        sb.append('.');
        for (final Iterator<Integer> itr = digits.listIterator(1); itr.hasNext();) {
            final int digit = itr.next().intValue();
            if (digit >= 0) {
                sb.append(digit);
            } else {
                int insertPoint = sb.length() + digit;
                if ('.' == sb.charAt(insertPoint)) {
                    insertPoint += 1;
                    sb.append(0);
                }
                sb.insert(insertPoint, '{');
                sb.append('}');
            }
        }
    }
    return sb.toString();
}

Index

Feed

Other

Link

Pathtraq

loading...