算法笔记1-高精度模板(加减乘除)个人模板

目录

加法

减法

乘法

​编辑

除法


加法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath> 
#include <queue>

using namespace std;

typedef pair<int,int> PII;

const int N = 1e5 + 10;

int n;
int a[N],b[N],c[N];
bool st[10];



void solve()
{
    string sa,sb;
    cin >> sa >> sb;
    int la = sa.size(),lb = sb.size();
    for(int i = la - 1,j = 1; i >= 0; i --, j ++)
    {
        a[j] = sa[i] - '0';
    }
    for(int i = lb - 1, j = 1; i >= 0; i --, j ++)
    {
        b[j] = sb[i] - '0';
    }
    int lc = max(la,lb);
    int st = 0;
    int k = 1;
    for(int i = 1; i <= lc; i ++, k ++)
    {
        c[k] = a[i] + b[i] + st;
        if(c[k] >= 10)
        {
            st = 1;
            c[k] = c[k] % 10;
        }
        else
        {
            st = 0;
        }
    }
    if(st)
    {
        cout << st;
    }
    for(int i = k-1; i >= 1; i --)
    {
        cout << c[i];
    }
    // cout << k;
}

int main()
{
    solve();
    return 0;
}

 https://www.luogu.com.cn/problem/P1601

模板

 

#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B)
{
    //为了方便计算,让A中保存较长的数字, B中保存较短的数字
    if (A.size() < B.size()) return add(B, A);
    //保存结果的数组
    vector<int> C;
    //进位,开始时是0
    int t = 0;
    //依次计算每一位
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];//加上 A 的第 i 位上的数字
        if (i < B.size()) t += B[i];//加上 B 的第 i 位上的数字
        C.push_back(t % 10); //C 中放入结果
        t /= 10;//t 更新成进位
    }
    //最后如果进位上有数,放进结果数组
    if (t) C.push_back(t);
    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');//倒序存储第二个数
    auto C = add(A, B);//调用加和函数
    for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];//倒序输出C中的数字
    cout << endl;
    return 0;
}

减法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath> 
#include <queue>

using namespace std;

typedef pair<int,int> PII;

const int N = 1e5 + 10;

int n;
int a[N],b[N],c[N];
bool st[10];
string sa,sb;

bool cmp(string x,string y)
{
    if(x.size() != y.size()) return x.size() > y.size();
    
	for(int i = 0; i < x.size(); i ++)
	{
		if(x[i] > y[i])
		{
			return true;
		}
		else if(x[i] < y[i]){
			return false;
		}
	}
	return false;
}
void solve()
{
	string a1,b1;
	cin >> a1 >> b1;
	
	bool flag = false;
	if(cmp(a1,b1))
	{
		sa = a1;
		sb = b1;
		flag = true;
	}
	else{
		sa = b1,sb = a1;
	}
	
	int la = sa.size(),lb = sb.size();
	for(int i = la - 1,j = 1; i >= 0; i --, j ++)
	{
		a[j] = sa[i] - '0';
	}
	for(int i = lb - 1, j = 1; i >= 0; i --, j ++)
	{
		b[j] = sb[i] - '0';
	}
	
	int k = 1;
	int st = 0;
	
	for(int i = 1; i <= la; i ++,k ++)
	{
		c[k] = a[i] - b[i] - st;
		
		if(c[k] < 0)
		{
			c[k] = a[i] + 10 - b[i] - st;
			st = 1;
		}
		else st = 0;
	}
	while(1 && k)
	{
		if(!c[k-1]) k --;
		else break;
	}
	if(!flag && k != 0) cout << "-";
	
	for(int i = k-1; i >= 1; i --)
	{
	    cout << c[i];
	}
	
	if(k == 0) cout << k;
	
}

int main()
{
    solve();
    return 0;
}

https://www.luogu.com.cn/record/159830019

乘法

//大数乘小数
#include<iostream>
#include<vector>

using namespace std;

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;
    }
    return C;
}

int main()
{
    string a;
    int b;
    cin>>a>>b;
    if(b == 0){ 
        cout << 0; 
        return 0;
    }
    vector<int>A;

    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');

    auto C=mul(A,b);
    
    bool is_first = false;
    for(int i=C.size()-1;i>=0;i--){
        printf("%d",C[i]);
    }    

    return 0;

}
//大数*大数
/*
#include <iostream>
#include <vector>

using namespace std;

vector<int> mul(vector<int> &A, vector<int> &B) {
    vector<int> C(A.size() + B.size() + 7, 0); // 初始化为 0,C的size可以大一点

    for (int i = 0; i < A.size(); i++)
        for (int j = 0; j < B.size(); j++)
            C[i + j] += A[i] * B[j];

    int t = 0;
    for (int i = 0; i < C.size(); i++) { // i = C.size() - 1时 t 一定小于 10
        t += C[i];
        C[i] = t % 10;
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back(); // 必须要去前导 0,因为最高位很可能是 0
    return C;
}

int main() {
    string a, b;
    cin >> a >> b; // a = "1222323", b = "2323423423"

    vector<int> 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');

    auto C = mul(A, B);

    for (int i = C.size() - 1; i >= 0; i--)
        cout << C[i];

    return 0;
}
*/

 https://www.luogu.com.cn/problem/P1303

除法

#include <iostream>
#include <vector>
#include <algorithm>

typedef long long ll;

using namespace std;

vector <ll> div(vector <ll> &A,ll b,ll &r){ // 取r的地址符,是为了更改r的值,方便后面输出余数
    vector <ll> C; // 答案
    r = 0; // 余数
    for(int i = A.size() - 1;i >= 0;i --){ // 从最高位开始处理
        r = r * 10 + A[i]; // 上一次的余数乘10,再加上当前位上的数,就是被除数
        C.push_back(r / b); // 往C里压入这个被除数除b
        r %= b; // 计算余数
    }
    reverse(C.begin(),C.end()); // 因为除法运算中从高位开始计算,而前导0都在顶部而不是底部,所以要翻转过来
    while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除前导0
    return C; // 返回答案
}
int main(){
    string a;
    long long b;
    cin>>a>>b;
    vector <ll> A;
    for(int i = a.size() - 1;i >= 0;i --) A.push_back(a[i] - '0'); // 倒序
    ll r;
    auto C = div(A,b,r); // 答案
    for(int i = C.size() - 1;i >= 0;i --) cout<<C[i];
    return 0;
}

https://www.luogu.com.cn/problem/P1480

相关推荐

  1. 精度乘除

    2024-06-11 10:50:02       13 阅读
  2. 第一章 基础算法(二)(精度乘除

    2024-06-11 10:50:02       31 阅读
  3. 精度模拟算法

    2024-06-11 10:50:02       11 阅读
  4. php乘除函数

    2024-06-11 10:50:02       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 10:50:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 10:50:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 10:50:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 10:50:02       20 阅读

热门阅读

  1. 等保必须做?不做等保行不行?

    2024-06-11 10:50:02       12 阅读
  2. 一些简单却精妙的算法

    2024-06-11 10:50:02       7 阅读
  3. MySQL-函数/约束

    2024-06-11 10:50:02       9 阅读
  4. 深度解读ChatGPT基本原理

    2024-06-11 10:50:02       10 阅读
  5. Server-side encryption (SSE)

    2024-06-11 10:50:02       11 阅读
  6. Python实现Stack

    2024-06-11 10:50:02       13 阅读
  7. Git实际应用场景分析

    2024-06-11 10:50:02       13 阅读
  8. .net core webapi跨域

    2024-06-11 10:50:02       9 阅读
  9. 云计算 目录

    2024-06-11 10:50:02       11 阅读
  10. React@16.x(22)HOOK,useState 的原理

    2024-06-11 10:50:02       13 阅读
  11. 【Redis】Redis的数据淘汰策略有哪些

    2024-06-11 10:50:02       11 阅读