【高精度计算 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
- 【高精度计算 04】 大数加法与树结合
- 大数,高精度计算---大数加法
- 4、 大数,高精度计算---大数加法
- 高精度运算 大数加法
- 大数(高精度)加法
- 高精度大数加法
- 高精度计算----加法运算
- 高精度计算----加法
- 高精度加法计算
- 高精度计算加法
- 高精度计算之加法
- 高精度--大数加法 luogu 1601
- 大数加法-Tsinsen A1087.高精度加法
- 大数计算_加法
- 大数,高精度计算---大数减法
- 大数,高精度计算---大数乘法
- 大数,高精度计算---大数除法
- 大数,高精度计算---大数阶乘
- 密码加密与解密
- mysql 分区表删除分区后表定义也会自动变更
- vfat文件系统
- 第十周项目1 二叉树算法库
- [leetcode-304]Range Sum Query 2D - Immutable
- 【高精度计算 04】 大数加法与树结合
- for循环练习*阶乘然后求和
- JAVA学习10_@Override、@Deprecated和@SuppressWarnings注释说明
- 打造史上最简单,最实用的Log工具类
- 关于css中 line-height 在ie中和在chrome中错位的问题
- HDU 初级DP专题
- stm32f10x.h解析
- c++中类的内存问题
- 1027. Colors in Mars (20)