桁の長い数を足し算する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