【高精度计算 04】 大数加法与树结合
2015-11-13 19:49
405 查看
#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 -2 typedef 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); }
测试数据: 45 45466843748 54543 64736476438748 # 6372 # # 47367 # # # 643848 # #
测试结果: --------Pre-------- 45 45466843748 54543 64736476438748 6372 47367 643848 --------In-------- 64736476438748 6372 54543 47367 45466843748 45 643848 --------Post-------- 643848 47367 6372 64736476438748 54543 45466843748 45 --------sum-------- 259036839664671
算法思想:
————————————————–
将大整数相加运用到树中,树的每一个节点都是存储一个大整数,然后对树进行遍历,并对每个节点进行求和,最后输出遍历结果以及大数计算结果。
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- PowerShell中的加法运算详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- ASP实现加法验证码
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法
- Java中二叉树数据结构的实现示例
- c语言中用位运算实现加法技巧介绍