链表实现大数类阶乘
Posted titordong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表实现大数类阶乘相关的知识,希望对你有一定的参考价值。
题目
大数运算——计算n的阶乘 (n≥20)。
基本要求
(1)数据的表示和存储:
①累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求。
②试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。
(2)数据的操作及其实现:
基于设计的存储结构实现乘法操作,要求从键盘上输入n值;在屏幕上显示最终计算结果。
思路
建立大数类(其实好像想麻烦了),不过面向对象的方法还挺好写的,重载乘法,这里我搞麻烦了,一开始重载了大数乘法,其实弄一个大数乘整数就行了,然后其他的比较简单了,主要是细节,一直改Bug,终于好了。
1)类定义
class Biginteger {
Node *first;
int length;
public:
Biginteger() {
first = new Node(0);
}
Node *GetHead() {
return first;
}
friend ostream&operator<<(ostream &, const Biginteger&);
friend istream&operator>>(istream &, Biginteger&);
Biginteger operator+(int);
Biginteger operator*(Biginteger &);
Biginteger operator*(int);
bool operator==(Biginteger&);
Biginteger Cal_Mul(Biginteger&);
Biginteger Cal_Mul(int);
void Delete();
};
2)类实现(只有关键部分)
Biginteger Biginteger::operator*(int R)
{
Biginteger C;
Node *pc = C.first, *pa = GetHead()->link;
pc->insertAfter(0);
int t = R % 10;
int temp;
int n;
int num = 0;
while (R) {
pa = GetHead()->link;
pc = C.GetHead();
n = 0;
while (n < num) {
pc = pc->link;
n++;
}
num++;
while (pa != NULL) {
temp = t * pa->value;
if (pc->link == NULL) {
pc->insertAfter(temp % 10);
}
else {
pc->link->value += (temp % 10);
}
pc = pc->link;
if (pc->value >= 10) {
if (pc->link == NULL) {
pc->insertAfter((pc->value) / 10);
}
else {
pc->link->value += ((pc->value) / 10);
}
pc->value = (pc->value) % 10;
}
if (temp >= 10) {
if (pc->link == NULL) {
pc->insertAfter(temp / 10);
}
else {
pc->link->value += (temp / 10);
}
if (pc->link->value >= 10) {
if (pc->link->link == NULL) {
pc->link->insertAfter((pc->link->value) / 10);
}
else {
pc->link->link->value += ((pc->link->value) / 10);
}
pc->link->value = (pc->link->value) % 10;
}
}
pa = pa->link;
}
R /= 10;
t = R % 10;
if (pc->link == NULL && pa != NULL)
pc = pc->insertAfter(0);
else pc = pc->link;
}
return C;
}
3)阶乘实现
Biginteger Biginteger::Cal_Mul(int R) {
Biginteger ans;
ans.first->insertAfter(1);
if (R == 1) {
return ans;
}
for (int i(2); i <= R; i++) {
ans = ans * i;
}
return ans;
}
后记
依旧没有注释,提供一种思路吧,其实我觉得我写的很糙,太长了,而且一个结点只存了一个数字,有点浪费,不过亲测可用,思路差不多的可以参考一下。
2018/11/14 23: 31:14
以上是关于链表实现大数类阶乘的主要内容,如果未能解决你的问题,请参考以下文章