您的位置:首页 > 其它

【高精度计算 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


算法思想:

————————————————–

将大整数相加运用到树中,树的每一个节点都是存储一个大整数,然后对树进行遍历,并对每个节点进行求和,最后输出遍历结果以及大数计算结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息