0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

桁の長い数を引き算するC言語のプログラムを作ってみた

Posted at

桁の長い数を足し算するC言語のプログラムを作ってみたに続いて桁の長い数を引き算するC言語のプログラムを作ってみました。もしかしたら間違ってるかもしれません。

/*
 * BCD演算
 */
#include <stdio.h>
#include <string.h>

#define LEN 255      /* 最大桁数 */
int flag = 0;

void sub( char*  num1,  char*  num2, char*  ans)
{
    int i1 = strlen(num1);
    int i2 = strlen(num2);
    int ia = (i1 > i2 ? i1 : i2); 
    int carry = 0;
    
    /* 引き算をする時、num1よりnum2の数値が大きい時、答えがマイナスの値になる。
       例えば10-32の場合、答えは-22だが、計算手順として32-10=22を計算する。
       次に22にマイナスをつけるという順序で行う。だからnum1よりnum2の数値が
       大きい時はnum1とnum2を入れかえて計算を行い、答えにマイナスをつけるという
       方法をとる。
    */
    if (i1 < i2) { // num1よりnum2の方が大きい時
        flag = 1;
    }
    else if (i1 == i2) { // 値の長さが等しい時はfor文を使ってどちらが大きい値か確認する。

        for (int i = 0; i < i1; i++) {
            if (num1[i] < num2[i]) {
                flag = 1; // num2の方が大きい時は入れ替えるためにflagを1にする
                break;
            }
            else if (num1[i] > num2[i]) {
                break;
            }
        }
    }

    if (flag == 1) { // num2の方が大きい時はnum1とnum2を入れ換える
        char tmp[LEN];
        strcpy_s(tmp, LEN, num1);
        strcpy_s(num1,  LEN, num2);
        strcpy_s(num2, LEN, tmp);
        int i3 = i1;
        i1 = i2;
        i2 = i3;
    }

    ans[ia] = '\0';
    while (ia > 0) {  
        int n1 = i1 > 0 ? num1[--i1] - '0' : 0;
        int n2 = i2 > 0 ? num2[--i2] - '0' : 0;
        int sub = n1 - (n2 + carry);
        carry = 0;

        if (sub < 0) {
            sub = sub + 10;
            carry++;  // 例えば5-7のようにマイナスになるときは上位の桁から一つ値を借りるのでその目印にcarryにプラス1する
        }

        ans[--ia] = (char)(sub + '0');
    }

    if (flag == 1) { // 入れ替えた値を元に戻す
        char tmp[LEN];
        strcpy_s(tmp, LEN, num1);
        strcpy_s(num1, LEN, num2);
        strcpy_s(num2, LEN, tmp);
    }

}


int main(void)
{
    char num1[LEN], num2[LEN], ans[LEN + 1];
    printf("数値1を入力してください");
    scanf_s("%s", num1, LEN);

    int c;
    while ((c = getchar()) != '\n');

    printf("数値2を入力してください");
    scanf_s("%s", num2, LEN);

    sub(num1, num2, ans);

   
    int width = strlen(num1 > num2 ? num1 : num2 );

    printf(" %*s\n", width, num1);
    printf("-%*s\n", width, num2);
    printf("%s%*s\n", flag==1 ? "-": " ", width, ans);

    return 0;
}
数値1を入力してください4556456156415645644515645645641561564564564156
数値2を入力してください45564564564545645645645645645645444548296352
 4556456156415645644515645645641561564564564156
-  45564564564545645645645645645645444548296352
 4510891591851099998869999999995916120016267804
数値1を入力してください456456464
数値2を入力してください85458782112
 456456464
-85458782112
-85002325648
0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?