涉及知识点:数组,流程控制,函数等
要求:用整形数组表示10进制大整数(超过int的整数),数组的每个元素存储大整数的一位数字,实现大整数的加减法。
思路:
一,将读入的数字00001234化为1234
二,比大小
三,用0补位,若大数为12345,将小数补为01234,同为5位
四,加减法,具体看代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define Max 1000
void delete0(int num[], int *len) // 把000012345改成12345
{
int cnt = 0; // 计数有多少个无效0
int i = 0;
while (i < ((*len) - 1))
{
if (num[i] == 0)
{
cnt++;
i++;
}
else
{
break;
}
}
(*len) -= cnt;
for (int j = 0; j < (*len); j++) // 将存入的数前移覆盖无效的0
{
num[j] = num[j + cnt];
}
}
int cmp(int num1[], int num2[], int len1, int len2) // 大小对比
{
int temp = 0;
if (len1 > len2)
return 1;
if (len1 < len2)
return -1;
if (len1 == len2) // 删去无效的0后,假如两个数字同位
{
for (int i = 0; i < len1; i++)
{
if (num1[i] != num2[i])
{
if (num1[i] > num2[i])
return 1;
if (num1[i] < num2[i])
return -1;
}
else
{
temp++;
}
}
if (temp == len1) // 每位都相同
return 0;
}
return 0;
}
void add0(int ret, int num1[], int num2[], int *len1, int *len2) // 为较小数前补上0,直至与大数同位
{
if (ret == 1)
{
while ((*len1) > (*len2))
{
for (int i = (*len2); i > 0; i--)
{
num2[i] = num2[i - 1];
}
num2[0] = 0;
(*len2)++;
}
}
else if (ret == -1)
{
while ((*len1) < (*len2))
{
for (int i = (*len1); i > 0; i--)
{
num1[i] = num1[i - 1];
}
num1[0] = 0;
(*len1)++;
}
}
}
void num_subtrack(int num1[], int num2[], int len1, int ret) // 相减
{
int temp;
int carry = 0; // 是否进位or借位
int result[len1 + 1];
if (ret == 0) // 相同数字相减
{
cout << "0";
}
else if (ret == 1) // 大数减小数
{
for (int i = len1; i >= 0; i--)
{
temp = num1[i] - (num2[i] + carry);
if (temp >= 0)
{
result[i] = temp;
carry = 0;
}
else if (temp < 0)
{
result[i] = temp + 10;
carry = 1;
}
}
delete0(result, &len1); // 再次删去数字前头无效的0
for (int j = 0; j < len1; j++)
{
cout << result[j];
}
}
else if (ret == -1) // 小数减大数
{
for (int j = 0; j < len1; j++)
{
swap(num1[j], num2[j]);
}
for (int i = len1; i >= 0; i--)
{
temp = num1[i] - (num2[i] + carry);
if (temp >= 0)
{
result[i] = temp;
carry = 0;
}
else if (temp < 0)
{
result[i] = temp + 10;
carry = 1;
}
}
delete0(result, &len1);
cout << "-"; // 小减大,改为大减小然后添加负号
for (int j = 0; j < len1; j++)
{
cout << result[j];
}
}
}
void num_plus(int num1[], int num2[], int len1) // 相加
{
int temp;
int carry = 0;
int result[len1 + 1];
for (int i = len1; i >= 0; i--)
{
temp = num1[i] + (num2[i] + carry);
if (temp < 10)
{
result[i] = temp;
carry = 0;
}
else if (temp >= 10)
{
result[i] = temp - 10;
carry = 1;
}
}
if (carry == 1) // 若最大位进位,在前头输出1
cout << "1";
for (int j = 0; j < len1; j++)
{
cout << result[j];
}
}
int main()
{
int num1[Max] = {0};
int num2[Max] = {0}; // 初始化数组
char str1[Max + 1]; // 读入整数
char str2[Max + 1];
cout << "请输入第一个正整数: " << endl;
cin >> str1;
int len1 = strlen(str1);
for (int i = 0; i < len1; i++)
{
num1[i] = str1[i] - '0'; // 输入到整形数组中
}
cout << "请输入第二个正整数: " << endl;
cin >> str2;
int len2 = strlen(str2);
for (int i = 0; i < len2; i++)
{
num2[i] = str2[i] - '0';
}
delete0(num1, &len1);
delete0(num2, &len2);
int ret;
ret = cmp(num1, num2, len1, len2);
add0(ret, num1, num2, &len1, &len2);
cout << endl;
cout << str1 << " + " << str2 << " = ";
num_plus(num1, num2, len1); // 加法
cout << endl;
cout << str1 << " - " << str2 << " = ";
num_subtrack(num1, num2, len1, ret); // 减法
}
仅供参考.