高精度

1.大整数的存储

使用数组存储,把数的个位存在数组头部0,这样做在数组进位时,可以十分方便的在数组末尾添加一项,若把整数个位存在数组末尾,当进位时需要调整整个数组。(以上数组不涉及链表数组)

2.运算

模拟加法,逢十进一    
模拟减法,不够借一,保证A>=B, 保证最高位不会借位
模拟乘法,将乘数看成一个整体(一位数),每次相乘哪一位就加上前一位的进位, 所得的值模10取得当前这位的值,除10表示当前位向上一位的进位

3.代码

#include<vector>
#include<iostream>

using namespace std;

const int N = 1e6 + 10;

vector<int> add(vector<int>& A, vector<int>& B)
{
	vector<int>C;
	int t = 0;//t表示两位之和,初始为-1位之和为0
	for (int i = 0; i < A.size() || i < B.size(); i ++ )
	{
		if (i < A.size())t += A[i];
		if (i < B.size())t += B[i];
		C.push_back(t % 10);
		t /= 10;

	}
	if (t)C.push_back(1);
	return C;

}
vector<int> sub(vector<int>& A, vector<int>& B)
{
	vector<int>C;
	int t = 0;//
	for (int i = 0; i < A.size() ; i ++ )
	{
	  t = A[i] - t;//减去上一位的借位0或1
          if (i < B.size()) t -= B[i];//判断B[i]存在,存在则减去
          C.push_back((t + 10) % 10);//当前位结果
          if (t < 0) t = 1;//判断当前位是否向前借了一
          else t=0;
	}
        while(C.size()>1&&C.back()==0)C.pop_back();//使结果003变为3,去除多余的0 去掉前导零
	return C;
}

vector<int> mul (vector<int> A, int b)
{
    vector<int> C;
    int t = 0;
    for(int i = 0; i < A.size() || t; i ++)
    {
        if(i < A.size()) t += A[i] * b;
        C.push_back(t%10);
        t /= 10;
    }
    while(C.size() > 1 && C.back() == 0)C.pop_back();
    return C;
}

 vector<int> div (vector<int> A, int b,int &r)
  {
      vector<int> C;
      r = 0;
    for (int i = A.size() - 1; i >= 0; i--)
    {
	    r = r * 10 + A[i];
  		C.push_back(r / b);
  		r %= b;
    }
    reverse(C.begin(), C.end());
      while(C.size() > 1 && C.back() == 0)C.pop_back();
      return C;
  }


int main() 
{
	string a, b;//因为后面需要提取数的每位所以用string存储整数
	vector<int> A, B;
	cin >> a >> b;
	for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i] - '0');//a[i]-0使string类型保持的‘数’转换为数字int
	for (int i = b.size() - 1; i >= 0; i--)B.push_back(b[i] - '0');

	auto C = add(A, B);

	for (int i = C.size() -1; i >= 0; i--)
	{
		printf("%d", C[i]);
	}
}
posted @ 2024-03-01 21:29  这就叫做C++  阅读(9)  评论(0编辑  收藏  举报