这应该算是我真正意义上的第一篇博客,前一段时间写的都是当天学到的知识和对应的题目练习。
首先,对于高精度而言,其实就是去计算大的数字,就是平时我们使用的int类型或者long long int类型计算不出来的大数字。
下面给大家配一张平时常见到的数据类型对应的数值范围:
那么,我们首先开始高精度加法的学习:
(c++用户):
#include//万能头文件
using namespace std;
string x,y;
int a[100000],b[100000],c[100000],la,lb,lc;
int i;
int main()
{
cin>>x>>y;//输入对应的俩个数字(每个数字占一行)
la=x.length();
lb=y.length();//求出对应的长度
for(i=0;i0) lc++;
for(i=lc;i>=1;i--)
{
cout<
(c用户):
#include
#include//在C语言里面就要使用string头文件
char x[100000],y[100000];
int a[100000],b[100000],c[100000],la,lb,lc;
int i;
int max(int a,int b)
{
int c;
return c=(a>b)?a:b;
}//在C语言里面没有直接的max让我们使用,那么咱们自己写一个
int main()
{
scanf("%s",x);
scanf("%s",y);
la=strlen(x);
lb=strlen(y);//计算长度
for(i=0;i0) lc++;//前面那一个C++代码把关键点都说了,这里我就强调一下我遗漏的一点:
for(i=lc;i>=1;i--)//就是这里的if判断,如果最后要输出的数组c的最后一位lc的下一位>0
{
printf("%d",c[i]);//那么说明咱们要输出的位数lc要加一了
}
return 0;
}
在这里我总结一下:关于高精度加法的步骤
1.读入字符串
我在C++里面使用的是cin,在C语言里面使用的是scanf;
2.字符串转数组
就是把字符串放在数组里面;
3.字符串转数字(-'0')
s[ls-i]=x[i]-'0';就是使用数组s来倒序存放输入的字符串,并且通过减去‘0’来转换为数字;
4.竖式加法
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;//模板
5.判断进位
if(c[lc+1]>0) lc++;
6.倒序输出
i=lc;i>=1;i--//一定要记住是i--
最后,我再强调一下:高精度加法还可以(lc=max(la,lb)+1)同时下面的if改为(c[lc]==0&&lc>0或者lc>1都可以)lc--;
接下来就是高精度减法了:
(C++用户)//注意定义a、b、c数组的时候要记住是int型(而不是char型)
#include
using namespace std;
string x,y;
int a[100000],b[100000],c[100000],la,lb,lc;
int i;
int main()
{
cin>>x>>y;
la=x.length();
lb=y.length();
if(la1) lc--;//消去前导零,但是最起码要保留一位(不妨自己试试看)
for(i=lc;i>=1;i--)
{
cout<
(C用户)
#include
#include
char x[100000], y[100000];
int a[100000], b[100000], c[100000], la, lb, lc;
int i;
void swap1(char a[], char b[])//这里就是坑人的字符串转换
{
char c[100000];
strcpy(c, a);
strcpy(a, b);
strcpy(b, c);
}
void swap2(int* a, int* b)
{
int t;
t = *a;
*a = *b;
*b = t;//注意:只有传地址对应的参数才会在主函数里面改变,传值是不会变的
}
int main()
{
scanf("%s", x);
scanf("%s", y);
la = strlen(x);
lb = strlen(y);
if (la < lb || (la == lb && x < y))
{
swap2(&la, &lb);
swap1(x, y);
printf("-");//如果数字a小于b的判断
}
for (i = 0; i < la; i++)
{
a[la - i] = x[i] - '0';
}
for (i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0';
}
lc = la;
for (i = 1; i <= lc; i++)
{
if (a[i] < b[i])
{
a[i] = a[i] + 10;
a[i + 1]--;
}
c[i] = a[i] - b[i];
}
while (c[lc] == 0 && lc > 1) lc--;//去前导零
for (i = lc; i >= 1; i--)
{
printf("%d", c[i]);
}
return 0;
}//终于写完了
today is 2022_1_29;
以上就是我对于高精度加法和减法的了解。如果你觉得我的文章对你有用请点个赞支持一下吧,喜欢我写的文章那么请点个关注吧,如果我的文章里面知识点很多那么就请收藏一下方便您以后使用。如果此文章有错误或者有不同的见解欢迎评论或者私信我。