|
发表于 2018-2-3 14:55:49
|
显示全部楼层
本帖最后由 圣狄雅哥 于 2018-2-3 14:59 编辑
//实现输入任意长度字符串的整数减法
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}sqstack;
void Initstack(sqstack *s)
{
s->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
void push(sqstack*s,ElemType e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(ElemType*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top++)=e;
}
void pop(sqstack*s,ElemType*e)
{
if(s->top==s->base)
{
return;
}
*e=*(--s->top);
}
int stacklen(sqstack *s)
{
return (s->top-s->base);
}
void SUBTRACTION(sqstack*s1,sqstack*s2,sqstack*s3)
{
char a,b,c;
char carry=0;
while(stacklen(s1)!=0&&stacklen(s2)!=0)
{
pop(s1,&a);
pop(s2,&b);
c=(a-48)-(b-48)-carry+48;
if(c<'0')
{
c=c+'9'-47;
carry=1;
}
else
{
carry=0;
}
push(s3,c);
}
if(stacklen(s1)!=0)
{
while(stacklen(s1)!=0)
{
pop(s1,&a);
c=a-carry;
if(c<'0')
{
c=c+'9'-47;
carry=1;
}
else
{
carry=0;
}
push(s3,c);
}
}
else if(stacklen(s2)!=0)
{
while(stacklen(s2)!=0)
{
pop(s2,&b);
c='0'-carry-b;
carry=1;
c=c+'9'-47;
push(s3,c);
}
}
if(carry==1)
{
while(stacklen(s3)!=0)
{
pop(s3,&b);
push(s2,b);
}
carry=0;
while(stacklen(s2)!=0)
{
pop(s2,&b);
c='9'-b+49-carry;
push(s3,c);
carry=1;
}
push(s3,'-');
}
}
int main()
{
char e;
sqstack s1, s2, s3;
Initstack(&s1);
Initstack(&s2);
Initstack(&s3);
printf("请输入第一串任意整数,输入#表示结束:");
scanf("%c", &e);
while( e != '#' )
{
push(&s1, e);
scanf("%c", &e);
}
getchar(); // 回收回车符
printf("\n请输入第二串任意整数,输入#表示结束:");
scanf("%c", &e);
while( e != '#' )
{
push(&s2, e);
scanf("%c", &e);
}
getchar(); // 回收回车符
SUBTRACTION(&s1, &s2, &s3);
printf("\n两者的差是:");
while(stacklen(&s3) != 0)
{
pop(&s3, &e);
printf("%c", e);
}
return 0;
}
|
|