今天又继续研究高精度减法

欢迎来到我的博客:http://blog..cn/noisunyuhong

程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
short int sum[1000],length=0;//sum为结果,length为位数的长短
int cmp(int a[],int b[],int a_length,int b_length){
int i;
if(a_length>b_length)return 1;//如果a串长度比b串长度大,返回1
if(a_length<b_length)return -1;//如果a串长度比b串长度小,返回-1
for(i=a_length-1;i>=0;i--){
if(a[i]>b[i])return 1;//如果a串数值比b串数值大,返回1
if(a[i]<b[i])return -1;//如果a串数值比b串数值小,返回-1
}
return 0;//如果两数相等,返回0
}
int sub(int a[],int b[],int a_length,int b_length){
int flag,i;//flag位标记
length=a_length;//将a的长度赋给总长度
flag=cmp(a,b,a_length,b_length);//从cmp中获得两串信息
if(flag==0){
memset(a,0,sizeof(a));//将数组置0
return 0;//返回相等标记
}
if(flag==1){//如果a串长度比b串长度大 或 如果a串数值比b串数值大,返回1
//减法核心
for(i=0;i<length;i++)
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
a[i]=a[i]-b[i];
while(a[length]==0)length--;//获取减去后的长度并返回1
}
return 1;
}
//end
if(flag==-1){//如果a串长度比b串长度小 或 如果a串数值比b串数值小,返回-1
for(i=0;i<b_length;i++){
if(b[i]<a[i])
{
b[i+1]--;
b[i]+=10;
}
a[i]=b[i]-a[i];
}
length=b_length;
while(a[length]==0)length--;
return -1;
}
}
int main(){
char a[500],b[500];//用来读入两个串
int A[500]={0},B[500]={0},i,k;
int a_length,b_length;
gets(a),gets(b);//获取两个数
a_length=strlen(a);//获取数字a的长度
b_length=strlen(b);//获取数字b的长度
for(i=0;i<a_length;i++)
A[i]=a[a_length-i]-'0';//由数组A来保存获得的a每个字符的数值
for(i=0;i<b_length;i++)
B[i]=b[b_length-i]-'0';//由数组B来保存获得的b每个字符的数值
if(cmp(A,B,a_length,b_length)==0)//判断两串是否相等
{
printf("0\n"); //两数相等相减就等于0
system("pause");
return 0;//退出程序
}
k=sub(A,B,a_length,b_length);//k为标记是否为负数
if(k==-1)//判断a-b是否是负数
printf("-");//是负数就在将要打印的数字前加上负号
for(i=length-1;i>=0;i--)
printf("%d",A[i]);//打印相减后的结果,因为一开始没有将串倒置,所以倒着输出
system("pause");
return 0;
}
