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; }