⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a.c

📁 多数程序设计语言处理整数的能力是有限的
💻 C
字号:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"

#define NUMBER_LENGTH 1000

typedef int number[NUMBER_LENGTH];

typedef struct stack
{
	number num;
	int top;
}STACK;

void INPUT_EXPRESSION(STACK *S1,STACK *S2,int *sign);
STACK *STACK_CREATE_INIT();
STACK *ADD_OPERATION(STACK *S1,STACK *S2);
void SHOW_RESULT(STACK *R);
STACK *MINUS_OPERATION(STACK *S1,STACK *S2);

STACK *MINUS_OPERATION(STACK *S1,STACK *S2)//减法操作
{
	STACK *R,*temp;
	int i,length,flag,l1,l2;

	l1=l2=0;
	flag=0;
	R=STACK_CREATE_INIT();
	if(S1->top > S2->top){length=S1->top +1;flag=1;}
	if(S1->top == S2->top)
	{
		length=S1->top +1;
		while(l1!=S1->top+1 && l2!=S2->top+1)
			if(S1->num[l1++]>=S2->num[l2++])flag=1;
			else {flag=0;break;}
	}
	else length=S2->top +1;
	if(flag==0)//如果S2比S1大,交换
	{
		temp=S1;
		S1=S2;
		S2=temp;
		temp=NULL;
	}

	for(i=0;i<length;i++)//各位相减
	{
		if(S1->top!=-1 && S2->top!=-1)R->num[R->top++]=S1->num[S1->top--]-S2->num[S2->top--];
		else if(S1->top!=-1 && S2->top==-1)R->num[R->top++]=S1->num[S1->top--];
		else if(S2->top!=-1 && S1->top==-1)R->num[R->top++]=0-S2->num[S2->top--];
	}
	for(R->top=0;R->top<length;R->top++)//借位处理
	{			
		if(R->num[R->top]<0)			
		{		
			R->num[R->top]+=10;				
			R->num[R->top+1]--;			
		}
	}
	R->top--;
	while(R->num[R->top]==0)R->top--;
	if(flag==0)R->num[R->top]*=-1;//如果S1,S2交换过,还要对最高位取反
	return(R);
}

void SHOW_RESULT(STACK *R)//显示最终答案
{
	while(R->top!=-1)
	{
		printf("%d",R->num[R->top--]);
	}
}

STACK *ADD_OPERATION(STACK *S1,STACK *S2)//加法操作
{
	STACK *R;
	int i,length;

	R=STACK_CREATE_INIT();
	if(S1->top > S2->top)length=S1->top+1;
	else length=S2->top+1;

	for(i=0;i<length;i++)//各位相加
	{
		if(S1->top!=-1 && S2->top!=-1)R->num[R->top++]=S1->num[S1->top--]+S2->num[S2->top--];
		else if(S1->top!=-1 && S2->top==-1)R->num[R->top++]=S1->num[S1->top--];
		else if(S2->top!=-1 && S1->top==-1)R->num[R->top++]=S2->num[S2->top--];
	}
	for(R->top=0;R->top<length-1;R->top++)//进位处理,事实上最高位没有被处理,但不影响输出结果
	{
		if(R->num[R->top]>=10)
		{
			R->num[R->top]-=10;
			R->num[R->top+1]++;
		}
	}
	return(R);
}

STACK *STACK_CREATE_INIT()//栈的建立和初始化
{
	STACK *S;
	S=(STACK *)malloc(sizeof(STACK));

	S->top=0;
	return(S);
}

void INPUT_EXPRESSION(STACK *S1,STACK *S2,int *sign)//输入表达式
{
	int status;
	char ch;

	status=0;

	while(ch=getchar())
	{
		if(status==0)//输入第一个数字和运算符
		{
			if(ch>='0' && ch<='9')S1->num[S1->top++]=ch-'0';
			else
			{
				//第一个数字输入结束
				if(ch=='+'){S1->top--;*sign=0;status=1;}
				if(ch=='-'){S1->top--;*sign=1;status=1;}
			}
			continue;
		}
		if(status==1)//输入第二个数字
		{
			if(ch>='0' && ch<='9')S2->num[S2->top++]=ch-'0';
			else
			{
				S2->top--;//第二个数字输入结束
				break;
			}
			if(ch=='\n')break;
		}
	}
}

main()
{
	STACK *S1,*S2,*R;
	int sign=0;//运算符标记

	S1=STACK_CREATE_INIT();
	S2=STACK_CREATE_INIT();

	printf("输入表达式:");
	INPUT_EXPRESSION(S1,S2,&sign);
	if(sign==0)R=ADD_OPERATION(S1,S2);
	if(sign==1)R=MINUS_OPERATION(S1,S2);
	printf("\n结果是:");
	SHOW_RESULT(R);
	printf("\n");
	getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -