首页 > 其他分享 >高精度

高精度

时间:2024-03-01 21:34:19浏览次数:14  
标签:10 高精度 int back vector push size

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

标签:10,高精度,int,back,vector,push,size
From: https://www.cnblogs.com/LQWUI/p/18047995

相关文章

  • 高精度
    高精度对于大数,c++中没有可以有效存储的类型。python有自带高精。所以c++只能手写高精,处理大数四则运算问题。对于高精度,一般使用结构体,让代码更简洁。还要重载运算符,也是避免大量函数影响代码美观。以下是模板,基本原理是列竖式的加减乘除constintMAXL=2000;structNumber{......
  • 高精度模板!大众福音!
    超级福音!!!高进度模板两大传送门原址传送门(有详细讲解)发现地址传送门废话不多说,直接上代码!#include<bits/stdc++.h>structBigInt{ staticconstintmaxlength=1005; intnum[maxlength],len; voidclean(){ memset(num,0,sizeof(num)); len=1; } BigIn......
  • timeBeginPeriod 高精度定时器 Sleep
    #include"timeapi.h"#pragmacomment(lib,"winmm")//DWORD__stdcallThreadTest(LPVOIDpThreadParam){CLogmLog;inti=100;timeBeginPeriod(1);//1表示1ms精度while(i--){mLog.WriteLog("%d",i);......
  • BOSHIDA 高精度DC电源模块在科学实验中的作用与价值
    BOSHIDA高精度DC电源模块在科学实验中的作用与价值BOSHIDA高精度DC电源模块在科学实验中具有重要的作用和价值。下面列举了几个方面: 1.稳定的电源供电:科学实验中通常需要稳定的电源供电,以确保实验结果的准确性和可重复性。高精度DC电源模块能够提供稳定的直流电压输出,有效......
  • Windows高精度定时器
     自从上次封装微秒延时函数后,利用空闲时间试着封装一个微秒定时器(类似MFC定时器形式)使用起来效果还不错。 关于定时器的几点介绍:  1.设计采用了自动释放定时器节点方式(增加虚析构函数在内部做相关释放判断,即使用完不释放节点也没关系);  2.设计采用了双向链表方......
  • 数字式频率计、通用计数器、高精度频率计的操作使用说明
    在选择测量仪器之前必须了解待测信号的所有特性,附非肯定待测信号是纯净(无噪声干扰)、平稳、单一频率成分,否则应该在制订测试方案前用频谱分析仪先观测待测信号中的干扰信号及噪声电平,然后看计数器的性能是否能允许这些干扰并仍能成功地完成频率的测量。给相应通道输入频率信号,点击启......
  • 【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)
    蜜蜂路线题目描述一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房开始爬到蜂房,,有多少种爬行路线?(备注:题面有误,右上角应为)输入格式输入的值输出格式爬行有多少种路线样例#1样例输入#1114样例输出#1377提示对于100%的......
  • 高精度运算
    逆序voidreverse(string&s){for(inti=0;i<s.size()/2;i++){chart=s[i];s[i]=s[s.size()-1-i];s[s.size()-1-i]=t;}}高精度加法高精+高精stringans;voidadd(stringa,stringb){ans.cl......
  • 基础算法(七)高精度除法模板
    模板如下#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;vector<int>div(vector<int>&A,intB,int&r){vector<int>C;for(inti=0;i<A.size();i++){r=r*10+A[i];......
  • 基础算法(六)高精度乘法模板
    模板如下#include<iostream>#include<vector>usingnamespacestd;vector<int>mul(vector<int>&A,intb){vector<int>C;intk=0;for(inti=0;i<A.size();i++){k+=A[i]*b;C.push_back(k%10);......