高精度入门讲解(未完结)

大家好 我是蒟蒻 今天给大家带来高精度入门
自编哒
1. 不同语言的高精度 Python是自带的,C++是需要自己写的 那怎么写呢?
定义


这是一个概述
高精度加法模拟代码

高精度
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 10010;

int main() {
    char a[MAXN], b[MAXN], res[MAXN];
    cin >> a >> b;
    int n = strlen(a), m = strlen(b), len = max(n, m), carry = 0;
    for (int i = 0; i < len; i++) {
    从末位开始相减
        int x = i < n ? a[n - i - 1] - '0' : 0;
        int y = i < m ? b[m - i - 1] - '0' : 0;
        对位相加,同时加上进位
        int sum = x + y + carry;
        res[i] = sum % 10 + '0';
        算出是否需要进位
        carry = sum / 10;
    }
    最后一位是否有进位
    if (carry) {
        res[len++] = carry + '0';
    }
    res[len] = '\0';
    字符反转
    reverse(res, res + len);
    cout << res << endl;
    return 0;
}

题目环节

1. A + B Problem again

题目ID:3279必做题100分

最新提交:0 分

历史最高:0 分

时间限制: 200ms

空间限制: 32768kB

题目描述

时间:0.2s 空间:32M

题目描述:

给你两个十进制非负整数,数位最多有1000位,求他们的和

输入格式:

第一行输入一个整数

第二行输入一个整数

输出格式:

输出一个整数

样例输入:

12312312312142343254354354 4124354364565765456

样例输出:

12312316436496707820119810

约定:

A,BA,B都是正数
这种题明显就需要用高精度了 非常重要
\color{red}WACode

#include <btis/stdc++.h>
using namespace std;
int main()
{
	WA代码 没有用高精度 没有开 
	long long a , b; 
//	int a , b;
	cin >> a >> b;
	cout << a + b;
}

\color{yellow}CEcode

这个代码是有问题的
#include <bits/stdc++.h>
using namespace std;
int main() {
	string aa,k;
	int a[10005]= {0};
	int b [1005]= {0};
	cin >> a > >k;
	int len = a.size(),lenak = k.size();
	1.反向存储
	for(int i = 0 ; i < len ; i++使下标从1开始) {
		a[len - i] - a[i] = '0';
		for(int i = 1 ; i < k ; i++) {
			for(int i = 1 ; i < j ; i++) {
				cout << k;
			}
		}
	}
	2.相加
	for(int i = 1; i <= len3; i++) {
		c[i]=a[i]+b[i];
	}
	记得int c数组和len3
	3.进位
	先遍历c数组
	for(int i = 1 ; i <= len3 ; i++) {
		len3是c数组的长度
		if判断
		但是这时候会有个问题
		99+99=891
		所以这时候我们反向输出
		cout << a + b;//不是这个(
		if(c[i]>9) {
			c[i+1]=c[i+1]+(c[i]/10)
			       c[i]=c[i]%10;
		       }
	for(int i = len3 ; i >= 1; i--)
		       {
			       cout << c[i];
		       }
			       //去0
			       while一下嘛 然后len--
			       while(c[len3]==0 &&len3 > 1)
		       {
			       len--;
		       }
			       //反向输出
			       for(int i = len3 ; i >=1 ; i--)
		       {
			       cout << c[i];
		       }

			       return 0;
		       }

\color{green}奉上蒟蒻的ACcode
\color{red}CEcode是思路讲解

#include <bits/stdc++.h>
using namespace std;
int main()
{
	string l,k;
	int a[10005]={0};
	int b[1005]={0};
	int c[1005] = {0};
	cin >> l >>k;
	
	int len = l.size();
	int lenak = k.size();
	int len3 = max(len , lenak )+1;	
	for(int i = 0 ; i < len ; i++)
	{
		a[len - i] = l[i] -'0';
	} 
	for(int i = 0 ; i < lenak ; i++)
	{
		b[lenak - i] = k[i] - '0';
	}
	for(int i = 1; i <= len3; i++)
	{
		c[i]=a[i]+b[i];
	}
	for(int i = 1 ; i <= len3 ; i++)
	{
		if(c[i]>9)
		{
			c[i+1]=c[i+1]+(c[i]/10);
			c[i]=c[i]%10;
		 } 
	 } 
	//去0
	while(c[len3]==0 &&len3 > 1)
	{
		len3--;
	 } 
	//反向输出 
	这里我没放
	return 0;//非常好の习惯 
 } 

未完结……

首先,入门的人看不懂三目运算符

2 个赞

我的贴是针对基础算法的人看的哦 入门的都不玩高精度

1 个赞

也对哦

1 个赞