- ベストアンサー
筆算で割り算
4桁までの整数の加減乗除を筆算の形式で表示するプログラムなんですが、割り算の表示がどう直しても私の頭ではうまくいきません。どうかご助言いただければとおもいます。プログラム自体が長すぎて質問の部分に貼り付けれなかったので、補足かなにかをつかわせていただいてまた、貼り付けようと思います
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なるほど・・・ えー、ここが間違いです、という指摘でなくて申し訳ないのですが、せっかく加減乗算があるのでしたら、それを使って除算を表現してみてはいかがでしょうか。 除算の解の桁数を0桁と仮定 除数が被除数より小さいあいだ 除数を10倍 仮定する除算の解の桁数を1桁増やす 以下の手順で、除算の解のn桁目から1桁目まで順に求める 除数を1/10倍 除算の解のn桁目を0と仮定 除数が被除数より小さいあいだ 被除数から除数を引く 除算の解のn桁目を1増やす ここで使っている「10倍」「1/10倍」「減算」は、いずれも既にできているはずの演算ばかりなので、問題ないはずですよね。 「大小の比較」だけは「減算」だけでなく「結果の符号の取得」が必要なので、負数の扱いをちょっと考えないといけませんけど。 さて、4桁の整数の加減乗算だけを使って上記手順を行うと、条件によっては3桁の解しか求めることができません。これでは課題の条件に合いませんよね。どうしたらいいでしょうか? 答えはとても簡単ですので、ちょっと考えてみてください。
その他の回答 (3)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
わ、ごめんなさい。 桁合わせがうまくいっていませんでした。 除算の解の桁数を0桁と仮定 除数が被除数より小さいあいだ 除数を10倍 仮定する除算の解の桁数を1桁増やす 以下の手順で、除算の解のn桁目から1桁目まで順に求める 除数を1/10倍 除算の解のn桁目を0と仮定 除数が被除数より小さいあいだ 被除数から除数を引く 除算の解のn桁目を1増やす
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
どの変数が何なのか、解説はいただけるでしょうか。
補足
あ!すいません!省略しすぎました。じつは下の細くの前に以下の文があるのですが、長すぎて掲載できませんでした(>_<)表示も、割り算の関数も入力関数と同じようにして呼び出します。 #include<iostream.h> #include<iomanip.h> const int Keta = 4 ; // 整数の桁数 const int Syousuu = 2 ; // 求める割り算の小数点以下の桁数 const int Kazu_Max = 7 ; // 割り算の途中結果の最大数 void input_data( int [], int [], int[], int[], int &, int & ) ; void divide_data( const int [], int, int, int &, double &, int, int [], int [], int [], int [] ) ; void appear_data(int, int, int, double, int, const int [], const int [] ) ; void error_data( int & ) ; main() { int r[Keta] = {0} ; // 入力された整数 int s[Keta] = {0} ; int x[Keta] = {0} ; // 一つ目の整数の各位の数 int y[Keta] = {0} ; // 二つ目の整数の各位の数 int one, two = 0 ; //計算される整数 int amari = 0 ; // 加減乗除の答え double shou = 0 ; // 少数第二位まで求める場合の商 int choice = 0 ; // 割り算の結果表示選択 int shou_way[Kazu_Max] = {0} ; // 割り算の途中結果 int shou_way2[Kazu_Max] = {0} ; int keisan[Kazu_Max] = {0} ; int keisan2[Kazu_Max] = {0} ; // プログラムの説明 cout << "\n4桁までの整数の加減乗除を筆算の形式で表示します。" << endl; // 整数の入力 input_data( x, y, r, s, one, two ) ; while( one!=0 || two !=0 ){ //計算方法の選択 cout << "\n割り算の表示方法は余りを表示するなら0を、小数点以下2桁までを表示するなら1を入力してください。>>" << endl; cin >> choice ; // 加減乗除の計算 divide_data( x, one, two, amari, shou, choice, shou_way, shou_way2, keisan, keisan2 ) ; // 結果の表示 appear_data( one, two, amari, shou, choice, shou_way2, keisan2 ) ; //整数の入力 input_data( x, y, r, s, one, two ) ; } // プログラムの終了処理 cout << "\nプログラムを終了します。" << endl ; return 0 ; } // 入力関数 void input_data( int a[Keta], int b[Keta], int p[Keta], int q[Keta], int &ichi, int &ni ) { int figure ; cout << "\n一つ目の4桁までの整数を入力してください >>" << endl ; cin >> figure ; error_data( figure ) ; for( int i = 0 ; i < Keta ; i++ ){ ichi = figure ; p[0] = ichi ; a[i] = p[i] % 10 ; p[i+1] = ( p[i] - a[i] ) / 10 ; cout << a[i] ; } cout << "\n二つ目の4桁までの整数を入力してください(0を入力したら終了します) >>" << endl ; cin >> figure ; error_data( figure ) ; for( int i = 0 ; i < Keta ; i++ ){ ni = figure ; q[0] = ni ; b[i] = q[i] % 10 ; q[i+1] = ( q[i] - b[i] ) / 10 ; cout << b[i] ; } } // 不正入力関数 void error_data( int &value ) { while( value < -9999 || value > 9999 ){ value = 0 ; cout << "値が間違っています。" << endl; cout << "もう一度入力してください。" << endl; cin >> value ; } }
では補足をどうぞ
補足
ありがとうがとうざいます~(T_T)長いので割り算の計算の部分と表示の部分だけ記載させていただきますm(_ _)m //割り算の計算をする(余りを表示) for( int i = 1 ; i < Keta + 1 ; i++ ){ warizan2[i] = warizan[i-1] * 10 + a[4-i] ; ans[i] = warizan2[i] / ni ; ans2[i] = ni * ans[i] ; warizan[i] = warizan2[i] - ans2[i] ; } warizan2[5] = warizan[4] ; waru = static_cast< float >(ichi) / static_cast< float >(ni) ; rem = ichi % ni ; }else{ // 割り算の計算をする(小数第2まで表示) ; warizan2[7] = warizan[6] ; waru = static_cast< float >(ichi) / static_cast< float >(ni) ; for( int i = 1 ; i < Keta + 1 ; i++ ){ warizan2[i] = warizan[i-1] * 10 + a[4-i] ; ans[i] = warizan2[i] / ni ; ans2[i] = ni * ans[i] ; warizan[i] = warizan2[i] - ans2[i] ; } for( int i = 1 ; i < Syousuu + 1 ; i++ ){ warizan2[3+i] = warizan[3+i-1] * 10 ; ans[3+i] = warizan2[3+i] / ni ; ans2[3+i] = ni * ans[3+i] ; warizan[3+i] = warizan2[3+i] - ans2[3+i] ; } // 割り算の表示 cout << "\n割り算" << endl; if( judge == 0 ){ cout << " " << setw(9) << setprecision( 0 ) << setiosflags( ios :: fixed ) << waru << "・・・・・" << rem << endl; cout << " -------------------" << endl; cout << setw(4) << ni << " ) " << ichi << endl; for( int i = 1 ; i < Keta + 1 ; i++ ){ cout << setw(7+i) << warizan2[i] << endl; cout << setw(7+i) << ans2[i] << endl; cout << " ----------------" << endl; } }else{ cout << " " << setw(9) << setprecision( 2 ) << setiosflags( ios :: fixed | ios :: showpoint ) << waru << endl; cout << " -------------------" << endl; cout << setw(4) << ni << " ) " << ichi << endl; for( int i = 0 ; i < Keta + Syousuu ; i++ ){ for( int j = 0 ; j < i ; j++ ) cout << " " << setw(7+i) << ans2[i] << endl; cout << " ----------------" << endl; for( int j = 0 ; j < i ; j++ ) cout << " " << setw(7+i) << warizan2[i+1] << endl; }
お礼
返信が遅くなってすいません~~丁寧な回答、本当にありがとうございました☆おかげでプログラムが完成しました!!本当にありがとうございました☆☆