大數的加減法操作(C代碼)

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

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章