关于C++中竖式加减法的讨论 竖式加减法是编程初学者常见的练习题目,它模拟我们在纸上进行加减法运算的方式。下面我将从几个方面讨论在C++中实现竖式加减法的相关问题。 基本实现思路

  1. 数字存储 竖式加减法通常需要将数字以字符串或数组形式存储,便于逐位处理: cpp 复制 string num1 = "1234"; string num2 = "567";
  2. 对齐数字 需要将两个数字右对齐(个位对齐): cpp 复制 // 补齐前导零使长度相同 int max_len = max(num1.size(), num2.size()); num1 = string(max_len - num1.size(), '0') + num1; num2 = string(max_len - num2.size(), '0') + num2;
  3. 逐位计算 从最低位开始逐位相加/减,处理进位/借位: cpp 复制 int carry = 0; string result ; for(int i = max_len-1; i >= 0; i--) { int digit1 = num1[i] - '0'; int digit2 = num2[i] - '0'; int sum = digit1 + digit2 + carry; carry = sum / 10; result = to_string(sum % 10) + result; } if(carry > 0) { result = to_string(carry) + result; } 常见问题与解决方案
  4. 大数处理 C++基本数据类型有大小限制,竖式加减法可以处理非常大的数字(以字符串形式)。
  5. 减法处理 减法需要考虑借位和结果的正负: cpp 复制 // 比较两个数大小确定结果符号 bool isNegative = compare(num1, num2) < 0; if(isNegative) { swap(num1, num2); }

// 逐位减法 int borrow = 0; for(int i = max_len-1; i >= 0; i--) { int digit1 = num1[i] - '0' - borrow; int digit2 = num2[i] - '0'; borrow = 0;

if(digit1 < digit2) {
    digit1 

+= 10; borrow = 1; } result = to_string(digit1 - digit2) + result; } // 去除前导零 3. 格式化输出 要输出真正的竖式格式,需要考虑对齐和运算符位置: cpp 复制 void printVerticalAddition(const string& num1, const string& num2) { int max_len = max(num1.size(), num2.size() + 1); cout << setw(max_len) << num1 << endl; cout << "+" << setw(max_len - 1) << num2 << endl; cout << string(max_len, '-') << endl; cout << setw(max_len) << result << endl; } 进阶讨论

  1. 面向对象实现 可以创建一个BigNumber类封装大数运算: cpp 复制 class BigNumber { private: string value ; bool isNegative;

public: BigNumber(string num); BigNumber add(const BigNumber& other); BigNumber subtract(const BigNumber& other); void printVertical(); }; 2. 性能优化 • 使用vector代替string存储数字 • 预先分配结果空间避免频繁字符串拼接 • 使用位运算优化进位处理 3. 扩展功能 • 添加乘法、除法竖式运算 • 支持小数运算 • 添加输入验证和错误处理 示例完整代码 cpp 复制 #include #include #include using namespace std;

string verticalAddition(string num1, string num2) { int max_len = max(num1.size(), num2.size()); num1 = string(max_len - num1.size(), '0') + num1; num2 = string(max_len - num2.size(), '0') + num2;

int carry = 0;
string result

; for(int i = max_len-1; i >= 0; i--) { int digit1 = num1[i] - '0'; int digit2 = num2[i] - '0'; int sum = digit1 + digit2 + carry; carry = sum / 10; result = to_string(sum % 10) + result; } if(carry > 0) { result = to_string(carry) + result; } return result; }

void printVertical(string num1, string num2, string result, char op) { int max_len = max({num1.size(), num2.size() + 1, result.size()});

cout 

<< string(max_len - num1.size(), ' ') << num1 << endl; cout << op << string(max_len - num2.size() - 1, ' ') << num2 << endl; cout << string(max_len, '-') << endl; cout << string(max_len - result.size(), ' ') << result << endl; }

int main() { string num1 , num2; cout << "Enter first number: "; cin

num1; cout << "Enter second number: "; cin num2;

string sum 

= verticalAddition(num1, num2); printVertical(num1, num2, sum, '+');

return 0;

} 竖式加减法不仅是算法练习,也帮助理解计算机如何处理大数运算和基本算术原理。

0 条评论

目前还没有评论...