关于#高精度#的问题,如何解决?(语言-c++)

img


高精度减法的这块到底是什么意思吗



#include <iostream>
#include<vector>
using namespace std;
//判断是否有A>B.高位到低位比较
bool cmp(vector<int>&A,vector<int>&B)
{
  if(A.size()!=B.size())return A.size()>B.size();
  for(int i=A.size()-1;i>=0;i--)
      if(A[i]!=B[i])
  return A[i]>B[i];
return true;
}
  // 请在此输入您的代码
  //C=A-B.地位到高位运算

> **vector<int>sub(vector<int>&A,vector<int>&B){
    vector<int>C;
    for(int i=0,t=0;i<A.size();i++){
      t=A[i]-t;
      if(i<B.size())t-=B[i];
      C.push_back((t+10)%10);
      if(t<0)t=1;
      else t=0;
    }__**
    // 123-120=003去0.结果为0的话不能去掉
  while(C.size()>1 && C.back()==0)C.pop_back();
  return C;
  }

  int main(){

    string a,b;
    vector<int>A,B;

    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
  if(cmp(A,B))
  {
    auto C=sub(A,B);
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);

  }
  else
  {
    auto C=sub(B,A);
    printf("-");
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
  
  }
  return 0;
}

问题一。
这个sub函数到底是什么意思吗。

问题二.

img

,这个怎么减成318了

问题三。

img


{8, 6,4,2, 0,8, 6, 4, 2]
这也不对呀,二进制??

这就是模拟竖式笔算减法的过程。如果不够减,就加上10再减,也可以说是 % 10 取模,然后 t 就是借位

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题一:sub函数的作用是什么?

    sub函数是用于执行高精度减法运算的函数。它接收两个大整数作为参数,将第一个参数减去第二个参数,并返回结果。

    以下是一个简单的sub函数的示例代码:

    #include <iostream>
    #include <string>
    
    std::string sub(const std::string& num1, const std::string& num2) {
        std::string result;
        int len1 = num1.length();
        int len2 = num2.length();
    
        int carry = 0; // 存储借位
    
        // 逐位相减
        for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0 || carry == 1; i--, j--) {
            int digit1 = (i >= 0) ? num1[i] - '0' : 0;
            int digit2 = (j >= 0) ? num2[j] - '0' : 0;
    
            int diff = digit1 - digit2 - carry;
    
            if (diff < 0) {
                diff += 10;
                carry = 1;
            } else {
                carry = 0;
            }
    
            result.insert(result.begin(), diff + '0');
        }
    
        // 移除结果中的前导零
        int i = 0;
        while (result[i] == '0') {
            i++;
        }
        result = result.substr(i);
    
        return result;
    }
    
    int main() {
        std::string num1 = "123456789";
        std::string num2 = "987654321";
    
        std::cout << sub(num1, num2) << std::endl;
    
        return 0;
    }
    

    问题二:计算结果为什么是318?

    这个问题很可能是代码中的某个错误导致的。根据你提供的信息,无法确定具体的问题所在。可能的问题包括参数传递错误、算法错误等等。

    你可以检查以下几点来确定问题:

    1. 确保你传递给sub函数的两个参数是正确的。
    2. 检查sub函数中的逻辑和算法是否正确,特别是在计算差值时是否遵循高精度减法的规则。

    如果你能提供更多的代码或错误信息,我可以帮你更具体地找出问题所在。

    问题三:结果是否以二进制形式表示?

    不,高精度减法的结果应该是以十进制形式表示的。高精度减法是用于计算大整数间的减法运算,结果应该是一个十进制整数。

    如果你的结果看起来像是一个二进制数,请检查你的代码中是否存在转换错误,或者在输出结果时是否使用了错误的格式化方法。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^