大家好 我是蒟蒻 今天给大家带来高精度入门
自编哒
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;//非常好の习惯
}
未完结……