大整數加減法c/c++實現
大整數加法
# include <iostream>
using namespace std;
template<typename T>
int count(T& x)
{
int s1 = sizeof(x);
int s2 = sizeof(x[0]);
int result = s1 / s2;
return result;
}
void add(int a[],int b[],int alength,int blength) {
int *p;
int m = 0;
int n = 0;
int flag = 0;
//在初始分配結果p陣列長度多與最長長度儲存進位
if (alength >= blength) {
p = new int[alength + 1]{ 0 };
m = blength;
n = alength + 1;
}
else {
p = new int[blength + 1]{ 0 };
m = alength;
n = blength + 1;
}
//同有位置的加法
for (int i = 0; i < m; i++) {
p[i] = (a[i] + b[i] + flag)%10;
flag = (a[i] + b[i] + flag) / 10;
}
//多餘位置的加法
if (alength >=blength) {
for (int i = m; i < alength ; i++) {
p[i] = (a[i] + flag) % 10;
flag = (a[i] + flag) / 10;
}
if (flag != 0) {
p[alength] = flag;
cout << "結果長度:" << (alength + 1) << endl;
for (int i = 0; i < alength + 1; i++)
cout << p[i] << " ";
}
else {
cout << "結果長度:" << alength << endl;
for (int i = 0; i < alength ; i++)
cout << p[i] << " ";
}
}
if (blength > alength) {
for (int i = m; i < blength; i++) {
p[i] = (b[i] + flag) % 10;
flag = (b[i] + flag) / 10;
}
if (flag != 0) {
p[blength] = flag;
cout << "結果長度:" << (blength + 1) << endl;
for (int i = 0; i < blength + 1; i++)
cout << p[i] << " ";
}
else {
cout << "結果長度:" << blength << endl;
for (int i = 0; i < blength; i++)
cout << p[i] << " ";
}
大整數減法
# include <iostream>
using namespace std;
template<typename T>
int count(T& x)
{
int s1 = sizeof(x);
int s2 = sizeof(x[0]);
int result = s1 / s2;
return result;
}
void reduce(int a[], int b[], int alength, int blength) {
int m = 0;
int n = 0;
int length = 0;
int *p = new int[alength]{ 0 };
length = alength;
m = blength;
for (int i = 0; i <blength; i++) {
if (a[i] >= b[i])
p[i] = a[i] - b[i];
else {
n = i;
//實現連環借位方法
while (1) {
if (a[i + 1] != 0) {
a[i + 1] = a[i + 1] - 1;
break;
}
else {
a[i + 1] = 9;
i = i + 1;
}
}
i = n;
p[i] = 10 - b[i] + a[i];
}
}
//解決a陣列多出來部分賦值問題,並第一次次排除頭為0的問題
for (int i = alength-1; i >=blength; i--) {
if (a[i] != 0) {
p[i] = a[i];
break;
}
else
length--;
}
for (int i = blength; i < length-1; i++) {
p[i] = a[i];
}
//第二次徹底解決頭為0的問題出現低二次原因是第一次在解決頭出現問題僅僅解決的是a陣列賦值有0情況。
for (int i = length-1; i >= 0; i--) {
if (p[i] == 0)
length--;
else
break;
}
cout << "結果長度:" << length << endl;
for (int i = 0; i < length ; i++)
cout << p[i] << " ";
delete[]p;
delete p;
}
void main() {
int alength = 0;
int blength = 0;
int *a;
int *b;
cout << "輸入長度alength:";
cin >> alength;
a = new int[alength] {0};
for (int i = 0; i < alength; i++) {
cin >> a[i];
}
cout << "輸入長度blength:";
cin >> blength;
b = new int[blength] {0};
for (int i = 0; i < blength; i++) {
cin >> b[i];
}
reduce(a, b, alength, blength);
delete[]a;
delete[]b;
delete a;
delete b;
}
}
delete []p;
delete p;
}
void main() {
int alength = 0;
int blength = 0;
int *a;
int *b;
cout << "輸入長度alength:";
cin >> alength;
a = new int[alength] {0};
for (int i = 0; i < alength; i++) {
cin >> a[i];
}
cout << "輸入長度blength:";
cin >> blength;
b = new int[blength] {0};
for (int i = 0; i < blength; i++) {
cin >> b[i];
}
add(a, b, alength, blength);
delete[]a;
delete[]b;
delete a;
delete b;
}