这应该算是我真正意义上的第一篇博客,前一段时间写的都是当天学到的知识和对应的题目练习。
首先,对于高精度而言,其实就是去计算大的数字,就是平时我们使用的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;i 0) 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;i 0) 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型)
#includeusing 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(la 1) 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;



