【高精度计算 04】 大数加法与树结合

来源:互联网 发布:navicat写sql语句 编辑:程序博客网 时间:2024/06/05 08:38
#include<stdio.h>#include <string.h>#include<stdlib.h>//数据结构声明//二叉树的链式存储结构#define NUM_SIZE 105    //大数位数最大为#define NODE_SIZE 20    //最大节点个数//常量定义#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef char TElemType[NUM_SIZE];typedef struct BiTNode{    TElemType data;    struct BiTNode *lchild;    struct BiTNode *rchild;//定义左右孩子指针}BiNode,*BiTree;//函数原型声明Status Visit(TElemType e);Status PreOrderTraverse(BiTree T,Status (*Visit)(TElemType));Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType));Status PostOrderTraverse(BiTree T,Status (*Visit)(TElemType));#define NUM_SIZE 105//打印节点数据Status Visit(TElemType e){    printf("%s\n",e);    return OK;}//先序遍历Status PreOrderTraverse(BiTree T,Status (*Visit)(TElemType)){    if(T)    {        if(Visit(T->data))            if(PreOrderTraverse(T->lchild,Visit))                if(PreOrderTraverse(T->rchild,Visit))                    return OK;                return ERROR;    }    else        return OK;}//中序遍历Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType)){    if(T)    {        if(InOrderTraverse(T->lchild,Visit))            if(Visit(T->data))                if(InOrderTraverse(T->rchild,Visit))                    return OK;                return ERROR;    }    else        return OK;}//后序遍历Status PostOrderTraverse(BiTree T,Status (*Visit)(TElemType)){    if(T){        if(PostOrderTraverse(T->rchild,Visit))            if(PostOrderTraverse(T->lchild,Visit))                if(Visit(T->data))                    return OK;                return ERROR;    }    else        return OK;}//定义二维数组,准备存储大数char num[NODE_SIZE][NUM_SIZE];int result[NUM_SIZE];int intArray[NUM_SIZE];int len;void CharArray(char* b)       //将字符串转换成整形数组{    int lenb=strlen(b);            if(b[0] == '0')        memset(intArray,0,sizeof(intArray));    else    {        for(int i=0;i<lenb;i++)        intArray[i]=b[lenb-i-1]-'0';       //逆序输出    }}void add(int* result, int* intArray){       for(int i=0;i<NUM_SIZE;i++)    {                                 //进行大数相加        result[i]+=intArray[i];        if(result[i]>9)        {            result[i]-=10;            result[i+1]++;        }    }                                  }//构造二叉树 Status CreateBiTree(BiTree &T){    char str[NUM_SIZE];    scanf("%s", str);       //每个节点的数据以字符串的形式输入    if(strcmp(str, "#") == 0)        T=NULL;    else    {        if((T=(BiTNode*)malloc(sizeof(BiTNode))))        {            strcpy(T->data, str);            strcpy(num[len++], str);        }        CreateBiTree(T->lchild);        CreateBiTree(T->rchild);    }    return OK;}void Sum(){    for(int i = 0; i < len; i++)    {        CharArray(num[i]);        add(result, intArray);    }}void printResult(int* result)        //输出结果,逆序输出{    int i=NUM_SIZE-1;    while(result[i]==0&&i>=0)        i--;                         //找最后一个非0数,其实是最高位    if(i<0)         printf("0");                 //这说明最终结果 是0    else        while(i>=0)             printf("%d",result[i--]);    printf("\n");}void main(){    BiTree T;    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);    CreateBiTree(T);    printf("\n");    printf("--------Pre--------\n");    PreOrderTraverse(T,Visit);    printf("\n");    printf("--------In--------\n");    InOrderTraverse(T,Visit);    printf("\n");    printf("--------Post--------\n");    PostOrderTraverse(T,Visit);    printf("\n--------sum--------\n");    Sum();    printResult(result);}
测试数据:45454668437485454364736476438748#6372##47367###643848##
测试结果:--------Pre--------45454668437485454364736476438748637247367643848--------In--------64736476438748637254543473674546684374845643848--------Post--------64384847367637264736476438748545434546684374845--------sum--------259036839664671

算法思想:
————————————————–
将大整数相加运用到树中,树的每一个节点都是存储一个大整数,然后对树进行遍历,并对每个节点进行求和,最后输出遍历结果以及大数计算结果。

0 0
原创粉丝点击