アプリ版:「スタンプのみでお礼する」機能のリリースについて

多数ケタの足し算をするプログラムでの実行結果で
入力した数値と結果を表す際、
どうしても上位桁に出る「0」が消せません。

例えば5桁の筆算の結果を表す際

 789 →入力した数値
+ 115 →入力した数値
= 904 →実行結果

と結果を表したいのですが、これが

 00789
+00115
=00904

という実行結果が出てしまいす。
つまり、上位桁の「0」消し、
なおかつ繰り上げられた数値「0」を消さない
ためにはどうしたらいいでしょうか?
ご教授お願いします。

A 回答 (7件)

No.4 です。

No.6 の方の回答で、

continue; -> printf(" ");

flag=1;
printf("%1d", line[i]);
の2行を、{ } でくくる。

以上の変更で、桁も揃いますよ。

No.4 で回答させていただいたのと同じ趣旨です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご参考にさせていただきます。

お礼日時:2006/02/02 22:43

とりあえず、上位の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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご参考にさせていただきます。

お礼日時:2006/02/02 22:42

答えが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;
}

補足日時:2006/02/02 17:31
    • good
    • 0

こういう方針で作った、練習用のプログラムだと仮定して……



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です。

流れをいじれば、もっとスマートな方法もありますが(一度、文字列に直すとかすれば、先行ゼロの判定がもう少しスマートになります)
    • good
    • 0

printf等での桁揃え


%nd
%0nd(0補)
nは揃えたい桁数
    • good
    • 0

どのように実現しているかわからないと


どう修正したらよいかは答えられないと思います。
プログラムを補足して下さい。
    • good
    • 0

まず、表示部分のソースコードを載せたほうがいいと思います。


それだけの情報では回答できないです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!