Recentemente, abri um blog do CSDN. Por um lado, quero aprender com os recursos do CSDN e, por outro lado, quero usar este blog para registrar o caminho.
Vamos falar sobre alta precisão: a
alta precisão também é chamada de inteiro grande, que é um número além do intervalo de dados de inteiro (int) ou mesmo (longlong). (O intervalo de int é -2147483648, o intervalo de 2147483647 / long long é -922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807)
Existe uma ideia para transformar números grandes em entrada de string.
Problema A + B (alta precisão)
#include<bits/stdc++.h>
using namespace std;
#define ma 100000
string x,y;
int a[ma],b[ma],c[ma],la,lb,lc;
int main ()
{
cin >>x>>y;
la= x.length();
lb= y.length();
for (int i=0; i<la; i++)
a[la-i]=x[i]-'0';
for (int j=0; j<lb; j++)
b[lb-j]=y[j]-'0';
lc=max(la,lb);
for (int k=1; k<=lc; k++)
{
c[k]+=a[k]+b[k];
c[k+1]=c[k]/10;
c[k]%=10;
}
if (c[lc+1]>0)
lc++;
for (int i=lc; i>0; i--)
cout << c[i];
return 0;
}
length () significa o comprimento da
string a;
int main ()
{ int n; cin >> a; // entrada asc n = a.length (); cout << n; // saída 3 return 0; } A subtração é semelhante à adição. Problema A * B
#include<bits/stdc++.h>
using namespace std;
#define ma 100000
string x,y;
int a[ma],b[ma],c[ma],la,lb,lc;
int main ()
{
cin >> x>>y;
la = x.length ();
lb = y.length ();
for (int i=0; i<la; i++)
a[la-i]=x[i]-'0';
for (int i=0; i<lb; i++)
b[lb-i]=y[i]-'0';
lc = la+lb;
for (int i=1; i<=la; i++)
{
for (int j=1; j<=lb; j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
while (c[lc]==0&&lc >1)lc--;
for (int i=lc; i>0; i--)
cout <<c[i];
return 0;
}
c[i+j-1]+=a[i]*b[j];
Cada vez que você multiplica, você tem que ir um bit para o primeiro
c [i + j] + = c [i + j-1] / 10;
c [i + j-1]% = 10;
há um transporte, e 1 corte 10 ;