/// <summary> /// 数字に変更されたときは、途中の数字がないところも、数字にして、数を更新する /// </summary> /// <param name="row">掛ける数のインデックス</param> /// <param name="col">桁</param> /// <param name="number">掛ける数</param> private void input_number(int row, int col, ref LongInteger number) { // 数字に変更されたときは、途中の数字がないところも、数字にする if (digit[row, col].getNumber() != -1) { for (int i = 0; i < col; i++) { if (digit[row, i].getNumber() == -1) { digit[row, i].setNumber(0); } } } // 数を更新する number.clear(); for (int i = cur_size_1 - 1; i >= 0; i--) { if (digit[row, i].getNumber() == -1) { number.shift_left_and_add(0); } else { number.shift_left_and_add(digit[row, i].getNumber()); } } }
/// <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> /// <returns>答えが正しいときtrue</returns> private bool check_answer() { LongInteger ans = number1.multiply(number2); for (int i = 0; i < cur_cols; i++) { if (digit[cur_rows - 1, i].getNumber() != ans[i]) { return(false); } } return(true); }
public MultexMultiplication(System.Windows.Forms.Panel panel, System.Windows.Forms.Label label, KeyboardSettings key, ViewSettings view) { panelCalc = panel; labelAnswer = label; //back_color = System.Drawing.Color.FromArgb(255, 245, 245); // パネルの背景の色 ran = new Random(); // キーボードの設定 key_settings = key; // 表示の設定 view_settings = view; number1 = new LongInteger(max_size); number2 = new LongInteger(max_size); single_mode = false; change_stage(Stage.Input1, true); }
/// <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="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); }
/// <summary> /// 答えを取得する /// </summary> /// <returns>答えの文字列</returns> private string get_answer() { LongInteger ans = number1.multiply(number2); return(ans.get_string()); }