大整数高精度(C++没有大整数类,ACWing算法基础)

大整数高精度(C++没有大整数类,ACWing算法基础),第1张

整数高精度(C++没有大整数类,ACWing算法基础) 高精度题目类型

假定A和B为正数,大整数A、大整数B,A和B的位数大概是10^6。

  1. A-B
  2. A+B
  3. A*a(a为比较小的数)
  4. A/a
解题思路

1、大整数的存储


使用一个数组存储大整数,最低位下标为0

2、 模拟加法运算

每一位计算包含计算Ai+Bi+t(下一位的进位为0或者1),Ai或者Bi不存在就置0,最后如果有进位高位补1。

代码实现

1、大整数加法

#include
#include//使用 vector表示大整数
using namespace std;
const int N = 1e6 +10;//1e6表示10^6,加10是为了防止边界问题



//加引用是为了提高效率,否则每执行一次函数数组都会被复制一遍
vector add(vector &A,vector &B)
{
  vector C;
  int t=0;//进位
  for(int i=0;i add(vector &A,vector &B)
{
  vector C;
  int t=0;//进位
  if(A.size()>a>>b;//a="123456"
   //1、大整数使用数组存储
   //逆序存放
   for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//A=[6,5,4,3,2,1]
    for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
   //2、模拟加法
   // auto让编译器自己推断变量是什么类型
   auto C = add(A,B);
   //倒序输出
   for(int i=C.size()-1;i>=0;i--)
   {
     printf("%d",C[i]);
   }
   return 0;
}

2、大整数减法

#include
#include//使用 vector表示大整数
using namespace std;
const int N = 1e6 +10;//1e6表示10^6,加10是为了防止边界问题

//判断A>=B?true:false
bool cmp(vector A,vector 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;//A=B
}

//加引用是为了提高效率,否则每执行一次函数数组都会被复制一遍
vector sub(vector &A,vector &B)
{
  vector C;
  int t=0;//借位
  //从低位开始进行减法运算
  for(int i=0;i0进行加10模10运算还是本身;t<0就进行了借位操作
     if(t<0) t=1;
     else t=0;
  }

  //去掉前导0
  // 如果C为0,必须要保留
  //vector的back函数返回最末一个元素,pop_back移除vector中的最后一个元素
  while(C.size()>1&&C.back()==0)
  {
    C.pop_back();
  }
  return C;
}



int main()
{
   string a,b;
   vectorA,B;
   
   cin>>a>>b;//a="123456"
   //1、大整数使用数组存储
   //逆序存放
   for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//A=[6,5,4,3,2,1]
    for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
   //2、模拟减法
   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;
}

3、大整数乘法

#include
using namespace std;
vector mul(vector &A,vector B)
{
  int t=0;
  vector C;
  //||t是考虑到最后最高位仍有进位的情况
  for(int i=0;i A;
  
  for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]='0');
  auto C=mul(A,b);
  for(int i=C.size()-1;i>=0;i--)prinf("%d",c[i]);
  return 0;
}

4、高精度整数除以低精度整数

#include
#include
using namespace std;
vector div(vector &A,int &b,int &r)
{
  vector C;
  
  //从最高位开始算
  for(int i=A.size()-1;i>=0;i--)
  {
    r=r*10+A[i];
    C.push_back(r/b);
    r=r%b;
  }

  reverse(C.begin(),C.end());
  // C数组应该从低位开始存
  //reverse在#include头文件
  
  while(C.size()>1&&C.back()==0) C.pop_back();//去掉前导0
}
int main()
{
  string a;
  int b;//小整数
  vector A;
  
  for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]='0'); 
  
  int r;//余数
  auto C=div(A,b,r);

  for(int i=C.size()-1;i>=0;i--)prinf("%d",c[i]);
  cout<					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5099610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存