数据结构:用链表实现大数运算(高精度)

采用链表实现大数运算

C++分为头文件程序和主体cpp函数

头文件函数如下:

#include<iostream>
using	namespace	std;
template<class	T>
struct	Node
{
	T	data;
	struct	Node<T>*prior;
	struct	Node<T>*next;
};

template<class	T>
class	Linklist
{
public:
	Linklist() { front = new	Node<T>; front = NULL; end = NULL; };
	Linklist(T	a[], int	n);//构造函数 
	void	Printlist();//打印函数
	void	Printshow();
	~Linklist();
	Node<T>*front;
	Node<T>*end;
};

template<class	T>
Linklist<T>::Linklist(T	a[], int	n)
{
	front = new Node<T>;
	end = new	Node<T>;
	Node<T>*r, *s;
	r = front;
	for (int i = 0; i < n; ++i)
	{
		s = new Node<T>;
		s->data = a[i];
		r->next = s;
		s->prior = r;
		r = s;
		end = r;
	}
	r->next = NULL;
}

template<class	T>
void	Linklist<T>::Printlist()
{
	Node<T>*s = front->next;
	while (s)
	{
		cout << s->data << " ";
		s = s->next;
	}
	cout << endl;
}

template<class	T>
void	Linklist<T>::Printshow()
{
	Node<T>*s = end;
	int	con=0;//控制负数前的0 
	while (s->prior != front)
	{
		if(s->data!=0||con) 
		{
			cout<<s->data;
			con=1;
		}
		s = s->prior;
	}
	cout << endl;
}

template<class	T>
Linklist<T>::~Linklist()
{
	Node<T>*p=front;
	while (p)
	{
		Node<T>* q = p;
		p = p->next;
		delete q;
		q = NULL;
	}

}


主函数:

#include<bits/stdc++.h>
#include"Linklist.h"
using	namespace	std;
int	NOTI=0;
struct HugeInt {
	int len;
	int num[100001];
};

HugeInt a, b, w;        //w为结果 
char c[100001], d[100001];//存储两个大整数 
bool negative;//存储正负号 

void Scan_HugeInt()
{   //读入两个大整数
	cout << "请输入第一个大数:" << endl;
	cin >> c;
	cout << "请输入第二个大数:" << endl;
	cin >> d;
	if((strlen(c) < strlen(d)) || (strlen(c) == strlen(d) && strcmp(c, d) < 0)) 
	{ //若被减数小 交换 记为负数 
		negative = true;
		swap(c, d);
	}
	a.len = strlen(c); //strlen求串长 
	b.len = strlen(d);
	for (int i = 0; i < a.len; i++) a.num[a.len - i] = c[i] - '0'; //逆序存储 
	for (int i = 0; i < b.len; i++) b.num[b.len - i] = d[i] - '0';
}

template<class	T>//加法运算 
void	Plus(Linklist<T>&link1, Linklist<T>&link2, Linklist<T>&link3)
{
	Node<T>*p = link1.front->next;
	Node<T>*q = link2.front->next;
	Node<T>*r = link3.front->next;
	while (r->next)
	{
		r->data += (p->data + q->data);
		r->next->data = r->data / 10;
		r->data%=10;
		
		r = r->next;
		p = p->next;
		q = q->next;
	}
	if(r->data!=0)
		NOTI=1;
}


template<class	T>//减法运算 
void	Minus(Linklist<T>&link1, Linklist<T>&link2, Linklist<T>&link3)
{
	Node<T>*p = link1.front->next;
	Node<T>*q = link2.front->next;
	Node<T>*r = link3.front->next;
	while(r->next)
	{
		if(p->data<q->data)
		{
			p->next->data--;
			p->data+=10;
		}
		r->data+=p->data-q->data;
		r = r->next;
		p = p->next;
		q = q->next;
	}
}



int	main()
{ 
	Scan_HugeInt();
	w.len = max(a.len, b.len);
	int	Res[20000];
	memset(Res, 0, sizeof(Res));
	Linklist<int>link1(a.num, w.len + 2);
	Linklist<int>link2(b.num, w.len + 2);
	//进行加法运算 
	Linklist<int>link3(Res, w.len + 2);//加法结果链表
	Plus(link1, link2, link3);
	cout<<"两数相加结果为:";
	/*if(NOTI)
		cout<<"1";*/
	link3.Printshow();
	//进行减法运算 
	Linklist<int>link4(Res, w.len + 2);//减法结果链表 
	Minus(link1, link2, link4);
	cout<<"两数相减结果为:";
	if(negative)
		cout<<"-";
	link4.Printshow();
	
	/*link1.Printlist();
	link2.Printlist();
	link3.Printlist();
	link4.Printlist();*/
}

总结:还是一个比较呆板的先存数组,再用数组初始化链表的过程,考虑进位退位判断负数等小细节即可

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值