【概述】
利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的尾数可达到几十甚至几百位,虽然计算机本身精度足够高,但受硬件限制,往往达不到实际问题所要求的精度,因此我们用程序设计的方法去实现这样的高精度计算。
除 C++ 高精算法之外,还可以选用 Java 大数类来处理高精问题,而且由于 Python 没有数据类型的限制,因此也可用 Python 来解决高精问题。
【要处理的问题】
1.数据接收与存储:当数据很长时,可以用字符串方式输入,利用字符串函数和运算操作,将每一位取出存入数组中。
void input()
{
string s;
cin>>s;//读入字符串
a[0]=s.length();//用a[0]存储字符串s的位数
for(i=1;i<=a[0];i++)//将数串转为数组a,并倒序存储
a[i]=s[a[0]-i]-'0';
}
2.位数的确定:接收时使用字符串,所以它的位数等于字符串的长度。
3.补零问题:当两个操作数长度不一样时,需要进行补零。
void fixed()
{
string str1,str2;
int len1,len2;
int i;
cin>>str1;//读入字符串1
cin>>str2;//读入字符串2
len1=str1.length();//求字符串长度1
len2=str2.length();//求字符串长度2
if(len1<len2)//当字符串1<字符串2时,对字符串1补零
for(i=1;i<=len2-len1;i++)
str1="0"+str1;
else//当字符串1>字符串2时,对字符串1补零
for(i=1;i<=len1-len2;i++)
str2="0"+str2;
}
4.进位、借位处理
加法:c[i]=a[i]+b[i];
if(c[i]>=10)
{ c[i]%=10;++c[i+1]; }
减法:if(a[i]<b[i])
{ --a[i+1];a[i]+=10; }
c[i]=a[i]-b[i];
乘法:c[i+j-1]=a[i]*b[i]+x+c[i+j-1];
x=c[i+j-1]/10;
c[i+j-1]%=10;
5.商和余数的处理:视被除数、除数的位数情况进行处理
【分类】
【例题】
1.入门模版题
- A+B Problem(高精)(洛谷-P1601)(高精加):点击这里
- 大整数加法(信息学奥赛一本通-T1168)(高精加):点击这里
- 高精度减法(洛谷-P2142)(高精减):点击这里
- 大整数减法(信息学奥赛一本通-T1169)(高精减):点击这里
- A*B Problem(洛谷-P1303)(高精乘):点击这里
- 高精度乘法(信息学奥赛一本通-T1307)(高精乘):点击这里
- 大整数乘法(信息学奥赛一本通-T1174)(高精乘):点击这里
- 求10000以内的阶乘(信息学奥赛一本通-T1172)(高精乘):点击这里
- 计算2的N次方(信息学奥赛一本通-T1170)(高精乘):点击这里
- 阶乘和(信息学奥赛一本通-T1173)(高精乘+高精加):点击这里
2.混合题
- B进制星球(洛谷-P1604)(高精度加法+递推):点击这里
- 回文数(信息学奥赛一本通-T1309)(高精加+条件判断):点击这里
- 除以13(信息学奥赛一本通-T1175)(高精除低精+预处理):点击这里
- 高精除(信息学奥赛一本通-T1308)(高精除高精):点击这里
- 大整数的因子(信息学奥赛一本通-T1171)(高精除分解因数):点击这里
- 国王游戏(洛谷-P1080)(高精乘+贪心):点击这里