鱼C论坛

 找回密码
 立即注册
查看: 5354|回复: 1

[萌新报道] 大数加法(栈)

[复制链接]
发表于 2016-11-13 12:03:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看完小甲鱼老师的视频教学后,自己编了一下。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define stackincrement 50
#define stacksize 100
typedef struct
{
        int* top;
        int* base;
        int size;
}stack;
void initstack(stack *q)
{
        q->base=(int*)malloc(stacksize*sizeof(int));
        if(!q->base)
        {
                exit(0);
        }
        q->top=q->base;
        q->size=stacksize;
}
void push(stack *q, int a)
{
        if((q->top)-(q->base)>=q->size)
        {
                q->base=(int*)realloc(q->base, (stackincrement+(q->size))*sizeof(int));
                if(!q->base)
                {
                        exit(0);
                }
                q->top=q->size+q->base;
                q->size=q->size+stackincrement;
        }
        *(q->top)=a;
        q->top++;
}
void pop(stack* q, int *a)
{
        if(q->top==q->base)
        {
                return;
        }
        *a=*--(q->top);
}
int len(stack q)
{
        return(q.top-q.base);
}
stack add(stack a, stack b)
{
        stack c;
        initstack(&c);
        int i, j, k, flag=0;
        if(len(a)>len(b))
        {
                while(len(a))
                {
                        pop(&a, &i);
                        if(len(b)==1)
                        {
                                j=0;
                        }
                        else
                        {
                                pop(&b, &j);
                        }
                        if(i+j>=10)
                        {
                                k=i+j-10+flag;
                                push(&c, k);
                                flag=1;       
                        }
                        else
                        {
                                k=i+j+flag;
                                if(k>=10)
                                {
                                        k=k-10;
                                        push(&c, k);
                                        flag=1;
                                }
                                else
                                {
                                        push(&c, k);
                                        flag=0;
                                }
                        }
                }
        }
        else
        {
                while(len(b)!=1)
                {
                        pop(&b, &j);
                        if(len(a))
                        {
                                pop(&a, &i);
                        }
                        else
                        {
                                i=0;
                        }
                        if(i+j>=10)
                        {
                                k=i+j-10+flag;
                                push(&c, k);
                                flag=1;       
                        }
                        else
                        {
                                k=i+j+flag;
                                if(k>=10)
                                {
                                        k=k-10;
                                        push(&c, k);
                                        flag=1;
                                }
                                else
                                {
                                        push(&c, k);
                                        flag=0;
                                }
                        }
                }
        }
        return c;
}
int main()
{
        int i, k;
        char c;
        stack a, b, d;
        initstack(&a);
        initstack(&b);
        printf("输入第一个随意大小整数,以#结束\n");
        scanf("%c", &c);
        while(c!='#')
        {
                i=c-48;
                push(&a, i);
                scanf("%c", &c);
        }
        printf("输入第二个随意大小整数,以#结束\n");
        scanf("%c", &c);
        while(c!='#')
        {
                i=c-48;
                push(&b, i);
                scanf("%c", &c);
        }
        printf("和为\n");
        d=add(a, b);
        while(len(d))
        {
                pop(&d, &k);
                printf("%d", k);
        }
        getch();
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-11-15 09:12:52 | 显示全部楼层
牛逼,完全看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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