大整数乘法c语言版

</pre><pre name="code" class="plain">#include<stdio.h>
#include<stdlib.h>
char fuhao='+';
/*数据节点*/
typedef struct node
{
    int data;
    struct node * next;
}_node;
/*链表控制结构*/
typedef struct
{
    _node *head;
    _node *tail   ;
    int      ndcnt;
}_ndctl;

/**********************************multip function*************************************************/
/***************************************************************************************************/

/************print************/
void print_num(_ndctl *ctl)
{
    int flag=0;
    _node *pnt;
    pnt = ctl->head;
    while(pnt!=NULL){
        if(pnt->data==flag){
            pnt=pnt->next;
            continue;
        }
        flag=-1;
        printf("%d",pnt->data);
        pnt=pnt->next;
    }
    if(flag==0){
        printf("0");
    }
    printf("\n");
}
/*乘数的输入保存*/
void create_num(_ndctl *ctl,char *fuhao)
{

    int       data = 1       ;
    _node  *pnt  =NULL ;
    char    c      ='s';

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

        if(c=='-'){
            *fuhao=c;
            continue;
        }

        if(c>='0'&&c<='9'){
             data    =  c-'0';
             pnt=(_node *)malloc(sizeof(_node));
             if(pnt==NULL){
                 printf("malloc failed!");
             return;
             }

             pnt->data=data;
             pnt->next=ctl->head;
             ctl->head=pnt;//头插法构建栈
             ctl->ndcnt++;

        }else{
            printf("your input is illegal !\n");
            exit(1);
        }
    }
}
/*为结果链表预先申请空间,比较安全*/
void result_malloc(_ndctl *ctl_result,int cnt)
{
    int flag=0;
    _node *pnt;
    while(flag<cnt){
        pnt=(_node*)malloc(sizeof(_node));
        if(pnt==NULL){
            printf("malloc filed!\n");
            return;
        }
        pnt->data=0;
        pnt->next=ctl_result->head;
        ctl_result->head=pnt;//头插法构建栈
        ctl_result->ndcnt++;
        flag++;
    }
}
/*链表逆序*/
void nixu_list(_ndctl * ctl)
{
    _node *h1,*h2,*h3;
    h1=ctl->head;
    h2=ctl->head->next;
    h3=h2->next;
    h1->next=NULL;
    while(h3){
        h2->next=h1;
        h1=h2;
        h2=h3;
        h3=h2->next;
        if(h3==NULL){
        h2->next=h1;//当h3为空时,h2为最后一个节点,只需让他指向倒数第二个节点 就完成了逆序
        }

    }
    ctl->head=h2;

}

/*乘法核心算法*/
void multip(_ndctl *ctl_result, _ndctl *ctl1, _ndctl *ctl2)
{
    _node *pnt1=ctl1->head;
    _node *pnt2=ctl2->head;

    int add=0;
    int temp=0;
    int temp1;

    _node *qt=ctl_result->head;
    _node *pnt_result=NULL;

    while(pnt2!=NULL){

        pnt_result=qt;

        while(pnt1!=NULL){
            temp=pnt1->data*pnt2->data+add;
            temp1=pnt_result->data+temp;
            pnt_result->data=(temp1%10);
            add=temp1/10;//进位
            pnt1=pnt1->next;
            pnt_result=pnt_result->next;
        }

        pnt_result->data+=add;
        add=0;

        pnt1=ctl1->head;
        pnt2=pnt2->next;

        qt=qt->next;


    }
    nixu_list(ctl_result);
}
/*free 存储空间*/
void free_fun(_ndctl *ctl)
{
    _node *pnt=NULL;
    _node *qt  =NULL;
    pnt=ctl->head;
    while(pnt!=NULL){
        qt=pnt;
        pnt=pnt->next;
        free(qt);
    }

}









/***********************begin main********************/
int main()
{
    char fuhao1=' ';
    char fuhao2=' ';
    _ndctl num1={NULL,0,0};//乘数
    _ndctl num2={NULL,0,0};//被乘数
    _ndctl result={NULL,0,0};//结果
    int      cnt   =  0;
    printf("please input first num:");
    create_num(&num1,&fuhao1);

    printf("please input second num:");
    create_num(&num2,&fuhao2);

    cnt=num1.ndcnt+num2.ndcnt;
    result_malloc(&result, cnt);
    multip(&result,&num1,&num2);
    printf("the result is: ");
    if(fuhao1!=fuhao2){
        printf("-");
    }
    print_num(&result);
    free_fun(&num1);
    free_fun(&num2);
    free_fun(&result);
    return 0;
}








    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/u013857493/article/details/37744805
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞