初次接触高精度,还是有一定的难度,重要的不是解题答案,而是思路。
当数据很大时,我们无法使用int,long等类型,只能通过字符串来输入,数组来输出。
其中,倒置思想为关键,可以参考小学数学的竖式。
下面是C的代码
加法:
#include
#include
int main()
{
int a[202]={0},b[202]={0},c[202]={0},l1,l2,l3,x=0,j=0,k,i;
char a1[2000],b1[2000];
while(scanf("%s%s",&a1,&b1)!=EOF){
l1=strlen(a1);
l2=strlen(b1);
for(i=0;i=1;k--)
{
printf("%d",c[k]);
}
printf("\n");
}
return 0;
}
减法:
#include
#include
int main(void)
{
char a[250];
char b[250];
int c[250]={0};
int d[250]={0};
int s[250]={0};
int i,j,k,m,n,l1,l2;
while(scanf("%s%s",&a,&b)!=EOF){
l1=strlen(a);
l2=strlen(b);
for(i=0;il2){
for(i=l2+1;i<=l1;i++){
d[i]=0;
}
}
for(i=0;i<=l1;i++){
s[i]=c[i]-d[i];
if(s[i]<0){
s[i]=10+s[i];
c[i+1]-=1;
}
}
while(s[i]==0)i--;
for(k=i;k>0;k--){
printf("%d",s[k]);
}
printf("\n");
}
return 0;
}
加减法思路相同,
首先将大数据储存在字符串中,然后通过-’0‘来转化为数字,通过for循环将数字储存在数组中,此时注意将数据倒置储存,strlen函数比较两字符串长度,如果不一样大则进行补0操作,遍历数组将两个数组相+/-,将结果储存在另一个数组中。
此时出现两个难点(其实只要注意一下就好)
在加法中,若数值超过10,则需要取模然后进位。
在减法中,若数值小于0,则将其+10;下一位减去1。
接着判断最后一位,如果最后一位数值等于0,则最后一位不读取。
最后通过for循环倒置读取数组数据,打印加减法结果。
接着是乘法
高精度乘法就需要采取递归思维,找到其中蕴藏的规律
通过观察竖式,我们可以发现乘法每一位上相加的数据与他们的数组下标有关,发现了规律,这道题就完成了一大半了,接着同加减法, 直接通过数组来储存每一位上的数据,注意进位即可。
#include
#include
int main(void)
{
char a[102];
char b[102];
int c[200]={0};
int d[200]={0};
int s[200]={0};
int i,m,j,k,l1,l2;
while(scanf("%s%s",&a,&b)!=EOF){
l1=strlen(a);
l2=strlen(b);
for(i=0;i0;k--){
printf("%d",s[k]);
}
printf("\n");
}
return 0;
}
乘法之后我们可以在考虑一下递归,当输入数据大于一定大小时,longlong类型已经无法储存数据了,这时我们可以考虑使用数组储存每一位的数据。
#include
#include
int main(void)
{
int a[10000]={0};
int k,i=0,n,m,j,y,count=1;
while(scanf("%d",&n)!=EOF){
a[0]=k=1;
for(i=1;i<=n;i++){
m=0;
for(j=0;j=0;i--)printf("%d",a[i]);
printf("\n");
memset(a,0,sizeof(a));
}
return 0;
}
递归相比于上面那三种题型,可以不必考虑使用字符串输入数据,再将其转化到数组,我们只需用一个变量来储存位数,再考虑进位问题就行。
高精度算法本质都一样,直接套用模板即可。多多训练就可以熟悉掌握。
百炼成钢,你就是下一个代码帝!