算法,学习过程中:摒弃形体,留存思想。并不局限于一门语言,设计思维才是需要把握的。
高精度减法,本文选用C++语言,包括一些C语言的库。
储存高精度的数字,必须使用构造数据类型。本文选择数组。
为了方便计算,引入cstring、cstdio、cstdlib。
高精度减法的步骤分为:输入、比较、计算、输出
一、输入
char类型数组存储被减数、减数、差
char s1[10100],s2[10100],s3[10100];
二、比较
比较被减数与减数的大小,区分我们的符号是正是负。
需要:
返回值为bool类型的compare比较函数,形参char类型的数组str1,str2
1.准备一个compare函数
bool compare(char str1[], char str2[])
2.比较有两种
第一种:位数多少比较
int len1=strlen(str1);
int len2=strlen(str2);
比较len1与len2
两种结果,1.位数相同,2位数不同。
第一种情况,位数相同,则进入第二种比较
第二种:对应位上的数大小比较
从高位到低位进行循环,逐一比较。
int len1=strlen(str1);
int len2=strlen(str2);
// 位数比较
if (len1!=len2) return len1>len2;
for (int i = 0; i < len1; ++i) {
// 每位上的数比较
if(str1[i] != str2[i]) return str1[i] > str2[i];
}
3.比较结果的处理
关于被减数与减数是否交换,以及符号的问题
创建全局变量flag记录符号
int flag=0;
借助第三个char数组进行变量交换,借助c语言库中函数strcpy进行交换
// 大小比较,如果s1<s2,交换
if (!compare(s1,s2)){
flag=1;
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
}
三、计算
转换int数组,考虑借位问题,所以倒序储存
重新获取减数与被减数的位数大小
char类型转换int类型-‘0’
int la,lb;
la=strlen(s1);
lb=strlen(s2);
// cout << "la=" << la << endl;
// cout << "lb=" << lb << endl;
//
// cout << "s1=" << s1 << endl;
// cout << "s2=" << s2 << endl;
for (int i = 0; i < la; ++i) {
a[la-i]=s1[i]-'0';
}
for (int j = 0; j < lb; ++j) {
b[lb-j]=s2[j]-'0';
}
减法计算中,借位之后,本位的值+=10,高一位的数字-=1
结果存入全局数组 c中
lc=max(la,lb);
for (int k = 1; k <= lc; ++k) {
// cout << "a["<<k<<"]=" << a[k] << endl;
// cout << "b["<<k<<"]=" << b[k] << endl;
if (a[k]<b[k]){
a[k+1]--;
a[k]+=10;
}
c[k]=a[k]-b[k];
}
最高位的处理
1.最高位的值为0,则消去最高位,再判断下一个位。以此循环。
2.如果结果位数为1,且结果为0,则不需要消去最高位。
while (c[lc]==0 && lc>1) lc--;
四、输出
1.符号输出
2.结果数组倒序输出
if (flag==1) printf("-");
for (int l = lc; l > 0; --l) {
printf("%d",c[l]);
}