C++知识点总结(5):高精度加减法代码


高精度加法代码

#include 
#include 
using namespace std;

int main()
{
    char num1[505] = {};
    char num2[505] = {};
    cin >> num1 >> num2;
    
    
    // 存储的整型数组
    int num1_int[505] = {};
    int num2_int[505] = {};
    
    // 取两个数字的长度
    int len_num1 = strlen(num1);
    int len_num2 = strlen(num2);
    
    // 遍历存储
    for (int i = 0; i <= len_num1-1; i++)
    {
        num1_int[len_num1-i-1] = num1[i] - 48;
    }
    for (int i = 0; i <= len_num2-1; i++)
    {
        num2_int[len_num2-i-1] = num2[i] - 48;
    }
    
    // 计算
    int len_ans = max(len_num1, len_num2);
    int ans[505] = {};
    int in = 0;
    for (int i = 0; i <= len_ans-1; i++)
    {
        ans[i] = num1_int[i] + num2_int[i] + in;
        in = ans[i] / 10; // 进位的结果
        ans[i] %= 10; // 存储真实结果的最后一位
    }
    
    // 特例先行
    if (in > 0)
    {
        ans[len_ans] = in;
        len_ans++;
    }
    
    for (int i = len_ans-1; i >= 0; i--)
    {
        cout << ans[i];
    }
	return 0;
}


高精度减法代码

#include 
#include 
using namespace std;

int main()
{
    char num1[505] = {};
    char num2[505] = {};
    cin >> num1 >> num2;
    
    
    // 存储的整型数组
    int num1_int[505] = {};
    int num2_int[505] = {};
    
    // 取两个数字的长度
    int len_num1 = strlen(num1);
    int len_num2 = strlen(num2);
    
    // 遍历存储
    for (int i = 0; i <= len_num1-1; i++)
    {
        num1_int[len_num1-i-1] = num1[i] - 48;
    }
    for (int i = 0; i <= len_num2-1; i++)
    {
        num2_int[len_num2-i-1] = num2[i] - 48;
    }
    
    // 计算
    int ans[505] = {};
	int len_ans = len_num1; // 默认大数-小数
	for (int i = 0; i <= len_ans-1; i++)
	{
	    if (num1_int[i] < num2_int[i]) // 借位的情况
	    {
	        num1_int[i+1]--; // 借一
	        num1_int[i] += 10; // 加10
	    }
	    ans[i] = num1_int[i] - num2_int[i]; // 减法
	}
	
	// 输出前写下面的代码
	while(ans[len_ans-1] == 0 && len_ans > 1) // 特例先行
	{
	    len_ans--; // 不会输出前面的0了
	}
    
    for (int i = len_ans-1; i >= 0; i--)
    {
        cout << ans[i];
    }
	return 0;
}


附:讲解

高精度加减法详细分析



附:减法完善(有负数情况的判断)

#include 
#include 
using namespace std;

int main()
{
    char num1[505] = {};
    char num2[505] = {};
    cin >> num1 >> num2;
    
    
    // 存储的整型数组
    int num1_int[505] = {};
    int num2_int[505] = {};
    
    // 取两个数字的长度
    int len_num1 = strlen(num1);
    int len_num2 = strlen(num2);
    
    // 如果两个数字相同不用执行下面的任何内容
    if (num1 == num2)
    {
        cout << 0;
        return 0;
    }
    
    // 如果第一个数字比第二个数字小,或者在两个数字位数相等的情况下,字符数组num1比字符数组num2小,也就是结果为负数的情况
    if (len_num1 < len_num2 || (len_num1 == len_num2 && strcmp(num1, num2) < 0))
    {
        swap(num1, num2);
        swap(len_num1, len_num2);
        cout << '-';
    }
    
    // 遍历存储
    for (int i = 0; i <= len_num1-1; i++)
    {
        num1_int[len_num1-i-1] = num1[i] - 48;
    }
    for (int i = 0; i <= len_num2-1; i++)
    {
        num2_int[len_num2-i-1] = num2[i] - 48;
    }
    
    // 计算
    int ans[505] = {};
    int len_ans = len_num1; // 默认大数-小数
	for (int i = 0; i <= len_ans-1; i++)
	{
	    if (num1_int[i] < num2_int[i]) // 借位的情况
	    {
	        num1_int[i+1]--; // 借一
	        num1_int[i] += 10; // 加10
	    }
	    ans[i] = num1_int[i] - num2_int[i]; // 减法
	}
	
	// 输出前写下面的代码
	while(ans[len_ans-1] == 0 && len_ans > 1) // 特例先行
	{
	    len_ans--; // 不会输出前面的0了
	}
    
    for (int i = len_ans-1; i >= 0; i--)
    {
        cout << ans[i];
    }
	return 0;
}

你可能感兴趣的:(c++,开发语言)