网上有关大数加减法操作的代码多是不带符号进行运算的,自己写了一个带符号的版本,供学习和参考,代码里面注释很详细,直接上代码
#include <stdio.h>
#include <string.h>
#define M 100 //定义了数量M是100作为数组初始化的数量
typedef struct bigint{
char num[M];
int symbol; //symbol是符号 0:+ 1:-
}Bigint,*pBigint;
int addnum(const char s1[], const char s2[], char result[]){ //单纯的不带符号数据的加法
int i, j, len_s1, len_s2;
int num1[M] = {0}; // 数字数组num1 (不带符号)
int num2[M] = {0}; // 数字数组num2 (不带符号)
int ans[M] = {0}; //数字数组(不带符号)
len_s1 = strlen(s1); // 求第一个加数的位数 (带符号)
len_s2 = strlen(s2);
for(i=len_s1-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第一个数
{
num1[j] = s1[i] - '0';
j++;
}
for(i=len_s2-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第二个数
{
num2[j] = s2[i] - '0';
j++;
}
for(i=0;i<M;i++){
ans[i]=num1[i];
}
for(i=0; i<=M; i++) //实现大数的加法
{
ans[i] = ans[i]+num2[i];
if(ans[i]>9)
{
ans[i] = ans[i]%10;
ans[i+1]++;
}
}
for(i=M-1; i>=0&&ans[i]==0; i--); //求得最终结果的位数
if(i>=0)
{
for(j=0; i>=0; j++,i--) //最终答案的输出
{
result[j] = ans[i]+'0';
}
}
else
printf("0");
result[j]=0;
return 0;
}
int subnum(const char s1[], const char s2[], char result[], int *result_symbol){ //单纯的不带符号的数据的减法(减出的结果会带符号)
int i,j,k,n,len_s1,len_s2; //n表示两个数字的大小 ,k表示参与运算数据最大位数
int num1[M] = {0}; // 数字数组num1 (不带符号)
int num2[M] = {0}; // 数字数组num2 (不带符号)
int ans[M] = {0}; //数字数组(不带符号)存放结果
len_s1 = strlen(s1); // 求第一个数的位数 (带符号)
len_s2 = strlen(s2);
for(i=len_s1-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第一个数
{
num1[j] = s1[i] - '0';
j++;
}
for(i=len_s2-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第二个数
{
num2[j] = s2[i] - '0';
j++;
}
k=len_s1>len_s2?len_s1:len_s2;
//n>0表示a>b, n<0表示a<b, n=0表示a=b
if(len_s1 > len_s2)
n = 1;
else if(len_s1 == len_s2)
n = strcmp(s1, s2);
else
n = -1;
//具体执行减法运算
for(i=0; i<k; i++)
{
if(n>=0)
{
if(num1[i]-num2[i] >= 0)
ans[i] = num1[i] - num2[i];
else
{
ans[i] = num1[i] + 10 - num2[i];
num1[i+1]--;
}
}
else
{
if(num2[i]-num1[i] >= 0)
ans[i] = num2[i] - num1[i];
else
{
ans[i] = num2[i] + 10 - num1[i];
num2[i+1]--;
}
}
}
//最终结果的输出
if(n<0)
*result_symbol = 1;
i=k-1;
while(i>=0){
if(ans[i]!=0){ //去除高位0
for(; i>=0; i--)
{
result[k-i-1]=ans[i]+'0';
printf("%d", ans[i]);
}
}
}
result[k]=0;
printf("\n");
return 0;
}
int add(pBigint s1 ,pBigint s2 , pBigint result){
//先求符号位
if(s1->symbol==0){
if(s2->symbol==0){ //都为正数
result->symbol=0;
return addnum(s1->num,s2->num,result->num);
}
else {//s1为正数s2为负数,则s1-s2
return subnum(s1->num,s2->num,result->num,&result->symbol);
}
}
else{
if(s2->symbol==0){ //s1为负数s2为正数
return subnum(s2->num,s1->num,result->num,&result->symbol); //s1为负数,则s2-s1
}
else { //都为负数
result->symbol=1;
return addnum(s1->num,s2->num,result->num);
}
}
return 0;
}
int sub(const pBigint s1 , const pBigint s2 , pBigint result){
//先解决符号位
if(s1->symbol==0){
if(s2->symbol==0) //都为正数
return subnum(s1->num,s2->num,result->num,&result->symbol);
else {
result->symbol=0; //s1为正数s2为负数,则s1+s2
return addnum(s1->num,s2->num,result->num);
}
}
else{
if(s2->symbol==0){ //s1为负数s2为正数
result->symbol=1;
return addnum(s1->num,s2->num,result->num); //s1为负数s2为正数,则s2+s1
}
else { //都为负数
return subnum(s2->num,s1->num,result->num,&result->symbol); //s1s2都为负数,则s2-s1
}
}
return 0;
}
int main()
{
Bigint snum1 , snum2 , result;
char s1[M+1],s2[M+1] ;
scanf("%s %s", s1, s2);
//数据处理 将符号位与数据位分离
if(s1[0]=='-')
snum1.symbol = 1;
else
snum1.symbol = 0;
if(s2[0]=='-')
snum2.symbol = 1;
else
snum2.symbol = 0;
strcpy(snum1.num, s1+1);
strcpy(snum2.num, s2+1);
printf("num1=%s,num2=%s\n",snum1.num, snum2.num);
add(&snum1 , &snum2 , &result);
if(result.symbol==0)
printf("\nadd result= %s\n",result.num);
else
printf("\nadd result= -%s\n",result.num);
sub(&snum1 , &snum2, &result);
if(result.symbol==0)
printf("\nsub result= %s\n",result.num);
else
printf("\nsub result= -%s\n",result.num);
return 0;
}