任意长度的两个大整数(字符数组表示)的加减法

上次帮同学用Java Swing写了一个简易计算器,只能进行整型数字的简单加减乘除。今天复习课本又见识到了大整数的加减法。看了好久,注释都放在代码中了,简单易懂,分享给大家。

#include
#include 
#include

//s数字字符长度最大20位 
#define N 20

//加法进位标志 
int addTag=0;

//减法借位标志 
int subTag=0; 

void beep()
{
	//鸣铃,表示操作有误 
	printf("\a");
}

//两字符相减 
char subChar(char ch1,char ch2)
{
	char ch;
	ch=ch1-ch2-subTag;
	
	if(ch>0)
	{
		subTag=0;
		//字符转为数字[0x30即为字符'0']
		return ch+0x30;
	}
	else//不够减时 
	{
		subTag=1;//产生借位 
		return ch+10+0x30;//借1当10
	}
}
//两字符相加 
char addChar(char ch1,char ch2)
{
	char ch;
	ch=(ch1-0x30+ch2-0x30)+addTag;
	
	if(ch>=10)//逢10进1 
	{
		addTag=1;//产生进位 
		return ch-10+0x30; //只留下个位 
	} 
	else
	{
		addTag=0;
		return ch+0x30; 
	} 
}
//去除结果中产生的多余的空格或无效0 
//eg:10001-10000=00001,直接显示1即可 
void leftTrim(char *str,char sign)
{
	int i;
	//找到第一个有效字符位置,其可能为字符串结束标志
	//eg;00001中的有效位置为1,而00000中的有效位置为\0 
	for(i=0;str[i]==' '||str[i]=='0';i++)
		;
	//此时表示计算结果正好为0,所以需保留一个0不去除
	//执行i-- 
	if(str[i]=='\0')
		i--;
	//如果结果为负数,需要在有效位置前面显示出来 
	if(sign=='-')
		str[--i]=sign;
		
	strcpy(str,str+i);
} 
void leftTrim2(char *str)
{
	int i;

	for(i=0;str[i]==' '||str[i]=='0';i++)
		;
	if(str[i]=='\0')
		i--;
	strcpy(str,str+i);
 } 
//读取数字字符串 
void getNumStr(char *s)
{
	int i=0;
	char ch;
	
	while(1)
	{
		ch=getch();
		if(ch=='\r')//回车符,表示当前整数输入结束 
			break;
		if(ch=='\b')//退格符,按一下删除一个字符 
		{
			if(i>0)
			{
				//打印一个ch只有退格功能,打印两个才是退格删除功能 
				printf("%c %c",ch,ch);
				i--;
			}
			else
				beep();
			continue;
		}
		if(ch<'0'||ch>'9')//若输入非数字字符,鸣铃警告 
		{
			beep();
			continue;
		}
		
		//排除掉上述几种情况后,剩下的就是数字字符了
		if(i=0&&j>=0)
		//对应字符相减【从最低位位到最高位】 
		c[k--]=subChar(a[i--],b[j--]);
	//a串长大于b串长时,b的相应位补0参与运算 
	//因为始终保证了a>b,所以不用考虑j>=0 
	while(i>=0)
		c[k--]=subChar(a[i--],'0');
		
	c[N+1]='\0';
	leftTrim(c,sign); 
}
//字符串相加 
void addNumStr(char a[],char b[],char c[]) 
{
	int i,j,k;
	memset(c,' ',N+2);
	
	i=strlen(a)-1;
	j=strlen(b)-1;
	k=N;
	//对应字符相加【从最低位位到最高位】
	while(i>=0&&j>=0)
		c[k--]=addChar(a[i--],b[j--]);
	//a串长大于b串长时,b的相应位补0参与运算
	while(i>=0)
		c[k--]=addChar(a[i--],'0');
	//a串长小于b串长时,a的相应位补0参与运算
	while(j>=0)
		c[k--]=addChar(b[j--],'0');
	//有进位,最高位补1	
	if(addTag==1)
		c[k]='1';
		
	c[N+1]='\0'; 
	leftTrim2(c);
	//leftTrim(c,'+');
	 
}

int main()
{
	//字符数组a,b用于保存输入的大整数,c用于保存结果 
	char a[N+1]={0},b[N+1]={0},c[N+2];
	
	printf("a=");
	while(strlen(a)==0)//保证输入前a,b为空 
		getNumStr(a);//读取数字字符串到数组中 
	printf("\nb=");
	while(strlen(b)==0)
		getNumStr(b);
	
	//计算a,b,结果置于c中 	
/*	
	subNumStr(a,b,c);
	printf("\na-b=%s\n",c); 
*/
	addNumStr(a,b,c);
	printf("\na+b=%s\n",c); 
}

 

你可能感兴趣的:(C)