C++高精度减法

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

/*
比较两个字符串的大小,并确保第一个字符串大于等于第二个字符串
入参:两个字符串的引用
如果第二个字符串比第一个字符串小,两个字符串进行对换
*/
void cmpAndSwap(string &str1, string &str2);

/*
将str字符串逐字符逆序存入到nums数组中,nums长度必须大于等于str长度
str : 需要被转换的字符串
nums : 存储数字的数组
len : nums数组的长度,填充0的时候需要用
*/
void strToIntArr(string str, int nums[], int len);

/*
按顺序打印数组元素
flag为true时正序打印
flag为false时倒序打印
*/
template <typename T>
void show(T arr[], int len, bool flag=true);

int main()
{
	string str1, str2;
	cin >> str1 >> str2;

	// 比较并交换,确保第一个字符串比第二个字符串大
	cmpAndSwap(str1, str2);

	// 确定数字数组的长度,通过cmpAndSwap已经确保str1长度比str2长,直接使用str1长度即可
	int len = str1.length();
	
	// 创建存储被减数、减数和差的数组
	int num1[len], num2[len], num3[len];
	
	// 将str1和str2字符串分别逐字符逆序存入str1和str2
	strToIntArr(str1, num1, len);
	strToIntArr(str2, num2, len);
	
	// 减法
	for(int i=0;i<len;i++)
	{
		/*
		判断对应位置的被减数是否比减数小
			如果小,则被减数+1位置的值-1,然后当前位置值+10
		执行减法,结果存入num3对应位置
		*/
		if(num2[i] > num1[i]){
			num1[i+1]--;
			num1[i] += 10;
		}
		num3[i] = num1[i] - num2[i];
	}
	
	// 如果num3数组中最后一位为0,len-1
	if(num3[len-1] == 0) len--;
	
	show(num3, len, false);
	
	return 0;
}

void cmpAndSwap(string &str1, string &str2)
{
	/*
	需要对换的情况:
	1、第二个字符串长度比第一个字符串长
	2、长度相同,但第二个字符串比第一个字符串大
	*/
	if(str1.length()<str2.length() || (str1.length()==str2.length() && str1<str2))
	{
		string temp = str1;
		str1 = str2;
		str2 = temp;
	}
}

void strToIntArr(string str, int nums[], int len)
{	
	// 数组数据填充为0
	// memset第三个参数为需要填充的字符数,计算应为每个int类型的所占字符数 * int数组的长度
	memset(nums, 0, sizeof(int)*len);
	// 确定str字符串长度,用于for循环
	int len1 = str.length();
	// 数据填充
	for(int i=0;i<str.length();i++) nums[i] = str[len1-i-1] - 48;
}

template <typename T>
void show(T arr[], int len, bool flag)
{
    if(flag)    // 正序打印
        for(int i=0;i<len;i++)
            cout << arr[i];
    else        // 逆序打印
        for(int i=len-1;i>=0;i--)
            cout << arr[i];
    cout << endl;
}

  

posted @ 2024-09-04 09:50  我信你个鬼!  阅读(4)  评论(0编辑  收藏  举报