诶,讲什么来着???
高精?!
好吧,步入正题:
高精有好多种来着,高精加,高精减,高精乘,高精除;
高精除又有两种,一个是高精除低精,一个是高精除高精。
首先是存储,因为数值极大,所以用字符串存储比较合适
然后倒序存储,如下:
void init(int a[]){//传入数组
string s;
cin>>s;//读入字符串s
a[0]=s.lenth();//a[0]为字符串s的位数,极为重要!!!
for(int i=1;i<=a[0];i++) {
a[i]=s[a[0]-i]-'0';//将字符串s转为数组a,并倒序存储
}
}
高精加:
既然是加法,就需要进位!进位!进位!(重要的事情说三遍)
进位解决的方法就是:
c[i]=a[i]+b[i];//逐位相加c[i]为进位数
if(c[i]>=10){//进位处理(加法中大于十进位)
c[i]%=10;
++c[i+1];//上一位加十
}
算法描述是这样纸的:
int c[Maxn];
inline void add(int a[],int b[]){//a,b,c都是数组,分别存储被加数,加数以及结果
int i=1,x=0;//x是进位的值
while((i<=lena)||(i<=lenb)){//lena和lenb分别是a和b的数组长度
c[i]=a[i]+b[i]+x;//第i位相加并加上上次的进位
x=c[i]/10;//向高位进位
c[i]%=10;//存储第i位的值
i++//位置下标
}
}
嗯嗯,就是这样纸了。
这个其实大家都知道啦,加法就是这样,所以底下来一道例题!!!
例题:
洛谷P1601
先上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char a1[100],b1[100];
int a[100],b[100],c[100],lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",a1);
scanf("%s",b1);
lena=strlen(a1);//输入加数与被加数
lenb=strlen(b1);
for (i=0;i<=lena-1;i++)
a[lena-i]=a1[i]-48; //将加数轻轻的放入a数组
for (i=0;i<=lenb-1;i++)
b[lenb-i]=b1[i]-48;//将被加数扔进b数组
lenc =1;
x=0;
while (lenc <=lena||lenc <=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x;//两数相加相当于:“c[i]=a[i]+b[i];”这个
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
if (c[lenc]==0)
lenc--;
for (i=lenc;i>=1;i--) //处理最高位
cout<<c[i];
cout<<endl;
return 0;
}
这题有一些地方是不全面的,
嗯。。。
例如说,在这一道题中并不要求要负数求值
所以一些复杂的东东就没有了!!!
(嘻嘻,其实少掉的东西是一个if判断啦!!!)
这里的if判断的是数之前有无负号,这样就要相应的改变一些代码去适应一下负号,即高精减!!!
还有就是这个代码中并没有函数,而是把函数中的东西都写到了主函数中了,这个是有迹可循的,具体的我有标注一些。
希望对大家有用啦!!!
高精加也就这些啦,希望大佬们给给点评!!!(如果有 新的理解我还会修改的!!!)