双向链表c语言5万的阶乘,链表实现大数类阶乘 - osc_3nz5xau6的个人空间 - OSCHINA - 中文开源技术交流社区...

链表实现大数阶乘
##题目 大数运算——计算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<

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);

elsepc = 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值