網上有關大數加減法操作的代碼多是不帶符號進行運算的,自己寫了一個帶符號的版本,供學習和參考,代碼裏面註釋很詳細,直接上代碼
#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;
}