高精度减法运算
程序员文章站
2022-03-21 19:32:30
eg:计算10002-99的差 ① ......
在C语言中,int类型最多只能表达的数据为【-2^31,2^31-1】,double类型虽然可以表达到300多位十进制数,但其精度损失很大,不能用于高精度计算,即使是long或者 __int64类型也只能表达【-2^63,2^63-1】的数据,所以高精度的大数减法计算需要通过数组模拟减法的过程。
①:比较两个数的大小(非负数),通过长度判断大小,若长度相等,使用strcmp比较,把结果(-1、0、1)存入res,相等直接跳出。
②:a数组和b数组逆序。
③:从较小的数(b数组)开始相减。
④:接下来在a数组考虑借位的情况。
⑤:将前导0除去。
⑥:若结果为负数,加上负号。
⑦:在数组最后以 ‘\0’ 结尾。
⑥:逆序回正常。
#include "stdio.h" #include "string.h" #include "algorithm" #define N 3005 using namespace std; int cmp(char a[],char b[]) //比较两个数大小 { //如果 a>b返回1,a=b返回0,a<b返回-1 int lena=strlen(a); int lenb=strlen(b); if(lena>lenb)return 1; if(lena==lenb)return strcmp(a,b); if(lena<lenb)return -1; } void sub(char a[],char b[],char c[]) { int t,i,r=0; int res=cmp(a,b); if(res<0) //如果第一个数小,需要交换 { strcpy(c,a); strcpy(a,b); strcpy(b,c); } else if(res==0) //如果相等直接跳出 { strcpy(c,"0"); return; } strrev(a); //逆序 strrev(b); //逆序 for(i=0;b[i]!='\0';i++) //低位至高位 { t=(a[i]-'0'-r)-(b[i]-'0'); //每位上的相减 if(t<0) { r=1; //向高位借1 t=t+10; } else r=0; //不借位 c[i]=t+'0'; //结果转换为字符 } for(;a[i]!='\0';i++) //a中剩下的还需考虑借位 { t=a[i]-'0'-r; if(t<0) { r=1; t=t+10; } else r=0; c[i]=t+'0'; } while(c[i-1]=='0') //去除前导0 i--; if(res<0) //若结果为负 c[i++]='-'; c[i]='\0'; //结尾 strrev(c); //逆序回正常 } int main() { char a[N],b[N],c[N]; scanf("%s %s",a,b); sub(a,b,c); puts(c); return 0; }
上一篇: 合并table中值相同的列