前几天搞了个高精度的加法,今天就搞了个高精度的减法。感觉有点难,所以只是拓展了减法,运算比较粗糙,各种判断方法也比较暴力。
高精度加减法的C语言实现(正整数)
#include<stdio.h>
int num1[100]={0};//数据1
int num2[100]={0};//数据2
char cnum[100]={0};//临时储存数据
int ans[100]={0};//结果
int m,n,t,i,j;//各种标记变量和计数器
void Add(){
for(;n>=1;n--){ //进行加法运算
if(i&&j) ans[n]=num1[i--]+num2[j--]+ans[n];//防止下标越界
else if(i)ans[n]=num1[i--]+ans[n];
else if(j)ans[n]=num2[j--]+ans[n];
if(ans[n]>=10){ //进位处理
ans[n]-=10;
ans[n-1]++;
}
}
}
void Sub(int p){ //减法运算
if(p==0)
for(;n>=1;n--){
if(i>=0&&j>=0) ans[n]=num1[i--]-num2[j--]+ans[n];//防止下标越界
else if(i>=0) ans[n]=num1[i--]+ans[n];
if(ans[n]<0){ //借位运算
ans[n]+=10;
ans[n-1]--;
}
}
if(p==1){
for(;n>=1;n--){
if(i>=0&&j>=0) ans[n]=num2[j--]-num1[i--]+ans[n];//防止下标越界
else if(j>=0) ans[n]+=num2[j--];
if(ans[n]<0){ //借位运算
ans[n]+=10;
ans[n-1]--;
}
}
}
}
int bigger(){ //比较两数据大小
for(int w=1;w<=i;w++){
if(num1[w]>num2[w]) return 0;
if(num1[w]<num2[w]) return 1;
}
return 0;
}
int main(){
printf("这是一个加减法运算程序,您需要输入所要运算的式子,运算符前后请不要加空格,请按回车键结束输入。\n");
printf("Ps.本程序暂时不支持负数运算。\n");
t=0;
i=1;j=1;
int p=0;
while(1){ //读取第一个数据
scanf("%c",&cnum[i]);
if(cnum[i]=='-'){ //判断数据结束并记录进行加法运算
i--;
t=1;
break;
}
if(cnum[i]=='+'){ //判断数据结束并记录进行减法运算
i--;
t=0;
break;
}
num1[i]=cnum[i]-48;//转化为数字存储
i++;
}
while(1){//读取第二个数据
scanf("%c",&cnum[j]);
if(cnum[j]=='\n'){//判断数据结束
j--;
break;
}
num2[j]=cnum[j]-48;//转化为数字存储
j++;
}
if(i>j) n=i;//判断结果长度,比较两数据大小并标记,保证进行减法时始终以大数减小数
else if(i==j){
p=bigger();
if(bigger()) n=j;
}
else if(j>i){
n=j;p=1;
}
m=n;//备份结果长度
if(t==0) Add();//进行加法运算
else Sub(p);//进行减法运算
i=0;
while(ans[i]==0){//略过开头的0
i++;
}
if(p&&t) printf("-");//输出符号
for(;i<=m;i++) //输出结果
printf("%d",ans[i]);
return 0;
}
高精度减法和加法还是有很区别的,如果用小数来减大数,借位处理时就会很麻烦。仅仅是把加号改成减号运算就不太合适,所以我写了一个函数bigger(),用来判断哪个数据更大,并且引入了一个变量p,来储存这个判断结果。 当数据2更大些时,输出减法运算结果之前先输出‘-‘。