Problem20


package com.yao.shuimu.euler;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: shuimuqinghua77
 * Date: 11-12-15
 * Time:   1:25
 */
public class Problem20 {

    public static void main(String[] args) throws Exception {

        byte[] result = digit(1);
        for (byte i = 1; i <= 100; i++) {
            result = multiply(digit(i), result);
        }

        int sum = 0;
        for (byte digit : result) {
            sum += digit;
        }
        System.out.println(sum);

    }

    private static byte[] multiply(byte[] multiplicand/**   **/, byte[] multiplier) throws Exception {
        if (multiplicand.length == 0 || multiplier.length == 0) {
            throw new Exception("   /    !!!");
        }
        if (multiplicand.length < multiplier.length) {
            byte[] temp = multiplier;
            multiplier = multiplicand;
            multiplicand = temp;
        }
        byte[] result = new byte[multiplicand.length + multiplier.length];
        for (int i = 0; i < multiplier.length; i++) {
            for (int j = 0; j < multiplicand.length; j++) {
                result[i + j] += (byte) (multiplier[i] * multiplicand[j]);
            }
            /**[29]->[9][2]  **/
            carry(result, 1 + multiplicand.length, i);
        }
        if (result[result.length - 1] == 0) {
            byte[] resultDest = new byte[result.length - 1];
            System.arraycopy(result, 0, resultDest, 0, result.length - 1);
            return resultDest;
        }

        return result;
    }

    private static void carry(byte[] result, int length, int base) {
        for (int i = base; i < length + base; i++) {
            byte decade = (byte) (result[i] / 10);
            if (decade >= 1) {
                result[i + 1] += decade;
                result[i] = (byte) (result[i] % 10);
            }
        }

    }


    private static byte[] digit(int original) {
        List<Byte> list = new ArrayList<Byte>();
        do {
            list.add((byte) (original % 10));
            original = original / 10;
        }
        while (original > 0);
        byte[] digit = new byte[list.size()];
        for (int i = 0; i < list.size(); i++) {
            digit[i] = list.get(i);
        }
        return digit;
    }
}