鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[技术交流] 任意长度的大数加法(栈的应用)

  [复制链接]
发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-3 15:03:15 | 显示全部楼层
小甲鱼那个程序改写的减法就是这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-22 21:31:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2018-3-2 02:40:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 14:54:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-27 01:07:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-28 17:43:53 From FishC Mobile | 显示全部楼层
棒棒的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-9 10:35:40 | 显示全部楼层
直接蒙了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-9 11:28:52 | 显示全部楼层
假如c的值是11,那么11-9=2,而栈操作是满10进1,将1放在carry中,0放在c中; '2'+48是将2变成ASCTT码中的2,若要使放入carry中的是1,放入c中的是0,则要加上47。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-9 16:10:11 | 显示全部楼层
/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-17 17:36:41 | 显示全部楼层
我想看代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-7 22:31:49 | 显示全部楼层
66666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 16:53:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-13 19:35:26 | 显示全部楼层
测试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-9 23:00:12 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-24 18:14:12 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表