- ベストアンサー
筆算(加法)について
多数ケタの足し算をするプログラムでの実行結果で 入力した数値と結果を表す際、 どうしても上位桁に出る「0」が消せません。 例えば5桁の筆算の結果を表す際 789 →入力した数値 + 115 →入力した数値 = 904 →実行結果 と結果を表したいのですが、これが 00789 +00115 =00904 という実行結果が出てしまいす。 つまり、上位桁の「0」消し、 なおかつ繰り上げられた数値「0」を消さない ためにはどうしたらいいでしょうか? ご教授お願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず、上位の0の抑制は以下の変更でできると思います。 見栄え上は、桁位置を揃える必要があるでしょうから、 それぞれの保持している有効桁を求めて、 最大の保有桁数を求めて そうした指定桁数での表示に変更するといいですね --------------------------------------------------------------- void lineprint(char c,char* line,int maxdigit) { int i,maxdigitlimit; int flag=0; maxdigitlimit=maxdigit-1; printf("%c",c); for(i=maxdigitlimit;i>=0;i--){ if(flag==0 && line[i]==0) continue; else flag=1; printf("%1d",line[i]); } printf("\n"); return; }
その他の回答 (6)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.4 です。No.6 の方の回答で、 continue; -> printf(" "); flag=1; printf("%1d", line[i]); の2行を、{ } でくくる。 以上の変更で、桁も揃いますよ。 No.4 で回答させていただいたのと同じ趣旨です。
お礼
ありがとうございます。 ご参考にさせていただきます。
- php504
- ベストアンサー率42% (926/2160)
答えが5桁以内ということならこういうことかな printf(" %5d\n", a); printf("+%5d\n", b); printf("=%5d\n", c); それよりどうやって0を表示させているかを知りたいですね
補足
今まで答えて頂いた方々すみません。 質問の仕方が不適切だったので補足します。 多数桁の足し算での筆算のプログラムで 70桁まで計算する場合です。 補足にてソースが全部載せる事ができたので 以下の通りです。 #include <stdio.h> #define MAXDIGIT 50 void reset(char*,int); void input(char*,int); void add(char*,char*,char*,int); void display(char*,char*,char*,int); void add_digit(char ,char ,char ,char* ,char* ); void display(char* ,char* ,char* ,int ); void lineprint(char ,char* ,int ); void linedraw(char ,int ); void main(void) { char a[MAXDIGIT],b[MAXDIGIT],c[MAXDIGIT]; reset(a,MAXDIGIT); reset(b,MAXDIGIT); reset(c,MAXDIGIT); input(a,MAXDIGIT); input(b,MAXDIGIT); display(a,b,c,MAXDIGIT); } void reset(char* buf,int maxdigit) { int i; for(i=0;i<maxdigit;i++) buf[i]=0; return; } void input(char* buf,int maxdigit) { char str[MAXDIGIT]; int i,j; printf("input data:"); scanf("%s",str); i=0; while(str[i]!='\0') i++; j=0; while(i>0){ buf[j]=str[i-1]-'0'; j++; i--; } return; } void add(char* a,char* b,char* c,int maxdigit) { int i; char carry_in,carry_out; i=0; carry_in=0; while(i<maxdigit) { add_digit(a[i],b[i],carry_in,&c[i],&carry_out); carry_in=carry_out; i++; } return; } void add_digit(char a,char b,char carry_in,char* c,char* carry_out) { *c=(a+b+carry_in)%10; *carry_out=(a+b+carry_in)/10; return; } void display(char* a,char* b,char* c,int maxdigit) { lineprint(' ',a,maxdigit); lineprint('+',b,maxdigit); linedraw('-',maxdigit+1); lineprint(' ',c,maxdigit); return; } void lineprint(char c,char* line,int maxdigit) { int i,maxdigitlimit; maxdigitlimit=maxdigit-1; printf("%c",c); for(i=maxdigitlimit;i>=0;i--){ printf("%1d",line[i]); } printf("\n"); return; } void linedraw(char c,int length) { int i; for(i=0;i<length;i++) printf("%c",c); printf("\n"); return; }
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
こういう方針で作った、練習用のプログラムだと仮定して…… int 足す数[5]; int 足される数[5]; /* 初期化 */ /* 配列を使った多桁の加算 */ for (i = 5; i >=0; i--) printf("%d", 足す数[i]); printf("\n"); /* 足される数と、答えも同様 */ ここで、単純に、足す数[i] == 0 で判定すると、途中の 0 も消えてしまいますね。 この流れをなるべく残すのであれば、 int 足す数のゼロでない桁見つけた = 0; for(i = 5; i >= 0; i--) { if ((足す数[i] == 0) && (足す数のゼロでない桁見つけた == 0)) { 足す数[i] の替わりに ' ' を表示; } else { す数のゼロでない桁見つけた = 1} } こんな感じで、最初に0でない数値を見つけるまでの処理を分ければOKです。 流れをいじれば、もっとスマートな方法もありますが(一度、文字列に直すとかすれば、先行ゼロの判定がもう少しスマートになります)
- Trick--o--
- ベストアンサー率20% (413/2034)
printf等での桁揃え %nd %0nd(0補) nは揃えたい桁数
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
どのように実現しているかわからないと どう修正したらよいかは答えられないと思います。 プログラムを補足して下さい。
- Enamon
- ベストアンサー率0% (0/1)
まず、表示部分のソースコードを載せたほうがいいと思います。 それだけの情報では回答できないです。
お礼
ありがとうございます。 ご参考にさせていただきます。