高精度加減法(大數相加 減)
阿新 • • 發佈:2019-01-04
題目來自學校的OJ平臺
Description
程式設計實現15位至25位整數的加減法。
Input
第一個數
+或者-
第二個數
Output
運算結果,注意結果的正負
Sample Input
10000000000000000000
-
110000000000000000000
Sample Output
-100000000000000000000
HINT
大數相加其實很早就寫了 做這道題卡在了大數相減的部分 現在想明白了
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int MAXN = 50; char a[MAXN], b[MAXN],tempab[MAXN],operator1; int ia[MAXN], ib[MAXN], lena, lenb; void add(void); void sub(void); void output(void); int main() { cin >> a >> operator1 >> b; //while (cin >> a >> operator1 >> b) //{ if (operator1 == '-') sub(); else if (operator1 == '+') add(); output();//刪除前導0 以及輸出 //memset(a, 0, MAXN); //memset(b, 0, MAXN); //最後的初始化 //memset(ia, 0, MAXN); //memset(ib, 0, MAXN);//初始化 //} system("pause"); return 0; } void add(void)//OK { lena = strlen(a); lenb = strlen(b); for (int i = 0; i < lena; i++) ia[lena - 1 - i] = a[i] - '0'; for (int i = 0; i < lenb; i++) ib[lenb - 1 - i] = b[i] - '0';//倒序存入陣列 OK if (lena < lenb)lena = lenb;//保證lena是比較大的 for (int i = 0; i < lena; i++) { ia[i] = ia[i] + ib[i]; if (ia[i] >= 10) { ia[i] -= 10; ia[i + 1]++; }//進位的情況 }//下面是test } void sub(void) { if (strlen(a) < strlen(b) || strlen(a) == strlen(b) && strcmp(a, b) < 0) { strcpy_s(tempab , a); strcpy_s(a , b); strcpy_s(b , tempab); cout << "-"; }//交換資料 保證a是比較大的那個 OK lena = strlen(a); lenb = strlen(b); for (int i = 0; i < lena; i++) ia[lena - 1 - i] = a[i] - '0'; for (int i = 0; i < lenb; i++) ib[lenb - 1 - i] = b[i] - '0';//倒序存入陣列 OK for (int i = 0; i < lena; i++) { if (ia[i] < ib[i]) { ia[i] += 10; ia[i + 1]--; } ia[i] = ia[i] - ib[i]; } } void output(void) { for (int i = lena-1; i >= 0; i--) { if (ia[i] == 0) lena--; else break; }//刪除前導0 bug if (lena == 0)cout << '0'; else { if (ia[lena] != 0)cout << ia[lena];//加法出現進位的情況 for (int i = lena-1; i >= 0; i--) { cout << ia[i]; } } }