近期开了优快云的博客,一方面想借优快云的资源好好学习,另一方面就是想用这个博客记录道路的点滴。
下面谈谈高精度:
高精度也叫大整数,就是超出整形(int)甚至(longlong)的数据范围的数。(int 的范围是-2147483648,2147483647/long long 的范围-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807)
有一种思想是把大数变成字符串string输入。
A+B Problem(高精)
#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()的意思是字符串的长度
string a;
int main ()
{
int n;
cin >>a;//输入asc
n = a.length();
cout <<n;//输出3
return 0;
}
减法和加法差不多。
A*B Problem
#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];
每次相乘,都要向先走一位
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
有进位,进1削10;