掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25957

多数桁の足し算を行う筆算のプログラム
投稿者---kurokuro(2006/02/02 18:00:09)


環境 WindowsXP・VisualStudio.NET2003
以下の実行結果だと
上位桁に「0」という数字が出てしまいます。
例えば48桁の数字を打ち込み実行すると(若干省略しますが)
1111…+1109…=1120…
としたいのに実際は
001111…+001109…=001120…
となってしまいます。
この上位桁の「0」だけを表示させないためには
どうしたらいいでしょうか。ご教授お願いします。

#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;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:多数桁の足し算を行う筆算のプログラム 25958 REE 2006/02/02 18:18:16
<子記事> Re:多数桁の足し算を行う筆算のプログラム 25959 RAPT 2006/02/02 18:21:40


No.25958

Re:多数桁の足し算を行う筆算のプログラム
投稿者---REE(2006/02/02 18:18:16)


>1111…+1109…=1120…
>としたいのに実際は
>001111…+001109…=001120…
>となってしまいます。
>この上位桁の「0」だけを表示させないためには
>どうしたらいいでしょうか。ご教授お願いします。

難しく考えることはありません。
始めに0以外になっているところから、表示し始めればよいです。



この投稿にコメントする

削除パスワード

No.25962

Re:多数桁の足し算を行う筆算のプログラム
投稿者---kurokuro(2006/02/02 22:00:33)


>難しく考えることはありません。
>始めに0以外になっているところから、表示し始めればよいです。

アドバイスありがとうございます。
頭の中を一回クリアにして改めて考え直す事にします。




この投稿にコメントする

削除パスワード

No.25959

Re:多数桁の足し算を行う筆算のプログラム
投稿者---RAPT(2006/02/02 18:21:40)


void lineprint(char c, char* line, int maxdigit) 
{
    int i, init = 1;
    putchar(c);
    for(i = maxdigit - 1; i >= 0; i--){
        if( init = (init && line[i] == 0) ){
            putchar(' ');
        }else{
            putchar('0' + line[i]);
        }
    }
    putchar('\n');
}

こんな感じ?


> scanf("%s",str);
あと、これは
scanf("%s%*c",str);
の方が後々楽だと思いますよ。



この投稿にコメントする

削除パスワード

No.25963

Re:多数桁の足し算を行う筆算のプログラム
投稿者---kurokuro(2006/02/02 22:05:03)


回答ありがとうございます。

ただ、このソースを参考に実行したら入力した数字は
要望通り表示されたのですが、最後の合計値が出ずに終わりました…。




この投稿にコメントする

削除パスワード

No.25965

Re:多数桁の足し算を行う筆算のプログラム
投稿者---TJ(2006/02/03 03:13:27)
http://home.f01.itscom.net/toge/programingreport/


>回答ありがとうございます。
>
>ただ、このソースを参考に実行したら入力した数字は
>要望通り表示されたのですが、最後の合計値が出ずに終わりました…。
>

main関数内でaddを使いわすれてますよ。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧