| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 571 人关注过本帖
标题:大位数乘法~
取消只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
 问题点数:0 回复次数:0 
大位数乘法~
最近学习数据结构是时候要实战巩固一下了~~看到有贴计算大位数乘法感觉不错~于是想到了用栈和队列求解~顺便巩固相关用法~

代码有点长~不过感觉其中包含了栈和队列的实战操作~可以作为参考~~

程序代码:
#include<stdio.h>
#include<stdlib.h>

#define LEN_Stack sizeof(Stack)
#define LEN_Queue sizeof (Qnode)

typedef struct Stack     //
{
    int n;              
    struct Stack* next;
}Stack;

typedef struct Qnode    //队列
{
    int n;
    struct Qnode* next;

}Qnode,*QnodePrt;

typedef struct
{
    QnodePrt front;
    QnodePrt rear;
}LinkQueue;

 
Stack* Stack_creat();                   //创建一个栈
void Stack_in(Stack** stack,int n);     //入栈
void Stack_out(Stack** stack);          //出栈
int Stack_empty(Stack* stack);          //判断栈空
void Stack_destory(Stack** stack);      //销毁栈

void Stack_input(Stack** stack);  //输入数据
void Stack_output(Stack* stack);  //输出数据

QnodePrt Queue_creat();                 //创建一个队列
void Queue_in(LinkQueue* queue,int n);         //入队
void Queue_out(LinkQueue* queue);              //出队
int Queue_empty(LinkQueue* queue);      //判断队列空
//void Queue_destory(LinkQueue* queue);   //清空队列

//void Queue_output(LinkQueue* queue);    //输出队列


void fun();                            //主要执行流程

void product(Stack* p2);              //乘积
void carry(LinkQueue* queue);         //进位
void save(QnodePrt* p2);              //保存数据
void show_result();                   //输出结果   

Stack* a=NULL;
Stack* b=NULL;
Stack* stack_result=NULL;    

LinkQueue queue={0};
LinkQueue queue_result={0};

int main()
{
                       //初始化数据
    Stack_input(&a);  
    Stack_input(&b);

    fun();

    return 0;
}

void fun()
{
    QnodePrt p3=NULL;

    while (!Stack_empty(b))
    {
        product(b);            //计算乘积
        Stack_out(&b);         //出栈
        carry(&queue);         //进位

        save(&p3);             //保存数据
        carry(&queue_result);  //进位
    }

    show_result();

    Stack_destory(&a);            //释放空间
    Stack_destory(&stack_result);
}

Stack* Stack_creat()
{
    Stack* stack=(Stack* )malloc(LEN_Stack);

    if (stack==NULL)
    {
        fprintf(stderr,"入栈失败!\n");
        exit(0);
    }

    return stack;
}

void Stack_in(Stack** stack,int n)
{
    Stack* p=Stack_creat();
    
    p->n=n;
    p->next=*stack;
        
    *stack=p;
}

void Stack_out(Stack** stack)  //出栈
{
    Stack* p=*stack;
    
    if (*stack==NULL)
        return ;
    
    *stack=(*stack)->next;
    
    free(p);
}

int Stack_empty(Stack* stack)  //判断栈空
{    
    return stack==NULL;
}

void Stack_destory(Stack** stack)   //释放栈
{
    Stack* p=*stack;
    
    if (p==NULL)
        return ;
        
    while (p)
    {
        *stack=(*stack)->next;
        free(p);

        p=*stack;
    }

    *stack=NULL;
    return ;
}

void Stack_input(Stack** stack)  //输入数据
{
    char c=0;

    while (c!='\n')
    {
        c=getchar();

        if (c>='0'&&c<='9')
            Stack_in(stack,c-'0');
    }
}

void Stack_output(Stack* stack)  //输出栈数据
{
    Stack* p=stack;
    while (p)
    {
        printf("%d",p->n);
        p=p->next;
    }

    puts("");
}


QnodePrt Queue_creat(LinkQueue* queue)            //创建一个队列
{
    QnodePrt p=(QnodePrt)malloc(LEN_Queue);

    if (p==NULL)
    {
        fprintf(stderr,"入队失败!\n");
        exit(0);
    }

    return p;
}

void Queue_in(LinkQueue* queue,int n)  //入队
{
    QnodePrt p=Queue_creat();

    if (queue->front==NULL)
        queue->front=queue->rear=p;
    else
    {
        queue->rear->next=p;
        queue->rear=p;
    }

    p->n=n;
    p->next=NULL;
}

void Queue_out(LinkQueue* queue)//出队
{
    QnodePrt p=NULL;

    if (queue->front==NULL)
        return ;

    p=queue->front;

    queue->front=queue->front->next;

    free(p);  

}

int Queue_empty(LinkQueue* queue)       //判断队列空
{
    return queue->front==NULL;
}

/*void Queue_destory(LinkQueue* queue)   //清空队列
{
    QnodePrt p=queue->front;
    if (queue->front==NULL)
        return ;

    while (p)
    {
        p=p->next;
        free(queue->front);
        queue->front=p;
    }
}*/

/*void Queue_output(LinkQueue* queue)    //输出队列
{
    QnodePrt p=queue->front;

    while (p)
    {
        printf("%d",p->n);
        p=p->next;
    }

    puts("");
}*/



void product(Stack* p2)     //乘积
{
    Stack* p1=a;   //乘数

    while (p1)
    {
        Queue_in(&queue,(p1->n*p2->n));  //
        p1=p1->next;
    }
}
void carry(LinkQueue* queue)                //进位
{
    QnodePrt p3=queue->front;

    while (p3->next)
    {
        if (p3->n>9&&p3->next)
        {
            p3->next->n+=p3->n/10;
            p3->n%=10;
        }
        p3=p3->next;
    }

    if (p3->n>9)  //考虑最高位是否进位
    {
        Queue_in(queue,p3->n/10);
        p3->n%=10;
    }
}

void save(QnodePrt* p2)               //保存数据
{
    QnodePrt p=NULL;               

    if (*p2!=NULL)
        *p2=(*p2)->next;            //每次计算保留数据都要前移一位

    p=*p2;

    while (!Queue_empty(&queue))
    {
        if (p==NULL)
        {
            Queue_in(&queue_result,queue.front->n);
            p=queue_result.rear;
        }
        else
            p->n+=queue.front->n;

        Queue_out(&queue);           //出队
        p=p->next;
    }

    if (*p2==NULL)
        *p2=queue_result.front;
}

void show_result()  //因为此时queue_result得到的结果是反向的,所以要进行处理
{
    while (!Queue_empty(&queue_result))  
    {
        Stack_in(&stack_result,queue_result.front->n);     //把结果入栈
        Queue_out(&queue_result);                          //出队
    }

    if (stack_result->n==0)                                //考虑第一位数为0的情况
    {
        puts("0");
        return ;
    }

    Stack_output(stack_result);                            //输出数据
}


[此贴子已经被作者于2017-3-14 03:56编辑过]

2017-03-14 03:37
快速回复:大位数乘法~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.216567 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved