/// <summary> /// 実際に1行の数を書き換える /// </summary> /// <param name="row">書き換える行</param> /// <param name="size">書き換える行の桁数</param> /// <param name="number">書き込む数</param> private void replace_one_number(int row, int size, LongInteger number) { for (int i = 0; i < number.get_length() && i < size; i++) { digit[row, i].setNumber(number[i]); } for (int i = number.get_length(); i < size; i++) { digit[row, i].setNumber(-1); } }
/// <summary> /// 掛け算を行う /// </summary> /// <param name="n">掛ける数</param> /// <returns>積</returns> public LongInteger multiply(LongInteger n) { LongInteger res = new LongInteger(get_length() + n.get_length()); for (int i = 0; i < get_length(); i++) { for (int j = 0; j < n.get_length(); j++) { int m = this[i] * n[j]; res.add(m % 10, i + j); res.add(m / 10, i + j + 1); } } return(res); }
/// <summary> /// 数を書き込む /// </summary> /// <param name="n">0〜9の数</param> private void set_number(int n) { switch (cur_stage) { case Stage.Input1: // 1個めの数を入力する段階 number1.shift_left_and_add(n); if (number1.get_length() > cur_size_1 && number1.get_length() < max_size) { // 入力領域のサイズを変更して、数をセットする set_long_numbers(number1, number2); } else { replace_one_number(0, cur_size_1, number1); } show_selection(); break; case Stage.Input2: // 2個めの数を入力する段階 number2.shift_left_and_add(n); if (number2.get_length() > cur_size_2 && number2.get_length() < max_size) { // 入力領域のサイズを変更して、数をセットする set_long_numbers(number1, number2); } else { replace_one_number(1, cur_size_2, number2); } show_selection(); break; case Stage.Mult: // 掛け算をやっている段階のとき(前半) // 中間領域に書き込む if (single_mode) { if (at_highest) { digit[2 + calc_pos_2, calc_pos_1 + calc_pos_2 + 1].setNumber(n); } else { digit[2 + calc_pos_2, calc_pos_1 + calc_pos_2].setNumber(n); } } else { if (at_high_digit) { digit[2 + calc_pos_2, calc_pos_1 + calc_pos_2 + 1].setNumber(n); } else { digit[2 + calc_pos_2, calc_pos_1 + calc_pos_2].setNumber(n); } } move_higher(); break; case Stage.Add: // 足し算をやっている段階のとき(後半) // 結果の領域に書き込む if (single_mode) { digit[cur_rows - 1, add_calc_pos].setNumber(n); } else { if (at_high_digit) { digit[cur_rows - 1, add_calc_pos + 1].setNumber(n); } else { digit[cur_rows - 1, add_calc_pos].setNumber(n); } } move_higher(); break; } }
/// <summary> /// 数をセットする /// </summary> /// <param name="n1">1個めの数</param> /// <param name="n2">2個めの数</param> private void set_long_numbers(LongInteger n1, LongInteger n2) { create_panels(n1.get_length(), n2.get_length()); replace_one_number(0, cur_size_1, n1); replace_one_number(1, cur_size_2, n2); }