刷题所得思

当求一个较大的数的阶乘时,例如100,由于其最终结果的数位极大,所以我们难以用正常的类型来表示出结果。所以我们可以考虑使用数组来储存该数据,最终达到储存的目的。

#include<iostream>//此代码可以用于求大数的阶乘时使用
using namespace std;
void factorial(int n)
{
	int arr[64];
	int t = n;
	arr[0] = 1;
	int length = 1;
	int jinwei, temp;
	for (int m = n; m > 1; m--)
	{
		int i = 0, jinwei = 0;
		for (i = 0; i < length; i++)
		{
			temp = arr[i] * m + jinwei;
			arr[i] = temp % 10000;
			jinwei = temp / 10000;

		}
		arr[i]=jinwei;
		if (jinwei > 0)
		{
			length++;
		}
	}
	cout << arr[length - 1];
	for (int i = length - 2; i > 0; i--)
	{
		cout << arr[i];
	}
}
int main()
{
	int n;
	cin >> n;
	factorial(n);
	return 0;
}

该代码中,以10000为分界线来将结果分解,原因是因为100*100=10000,所以100以内的两个数相乘时,不会高于10000.

修改版:

#include<iostream>
#include<string>
#define MAX_SIZE 100
//int arr[] = { 0 };
using namespace std;
int main()
{
	int arr[64] = { 0 };
	int n;
	cin >> n;
	arr[0] = n;
	int jinwei = 0;
	int temp = 0;
	int length = 1;
	for (int i = n-1; i > 0; i--)
	{
		for (int m = 0; m < length; m++)
		{
			temp = arr[m] * i + jinwei;
			arr[m] = temp % 10;
			jinwei = temp / 10;
		}
		if (jinwei)
		{
			length++;
			arr[length - 1] = jinwei;
		}
	}
	for (int m = length - 1; m >= 0; m--)
	{
		cout << arr[m] << endl;
	}
	return 0;
	
}

分别将两个链表的值加起来,输出。

#include<iostream>
#define MAXSIZE 100
typedef int ElemType;
typedef int state;
using namespace std;
typedef struct LNode
{
	ElemType data;
	struct LNode* Next;
}*LinkNode;
state InitLNode(LinkNode *p)
{
	if (p == NULL)
	{
		return 0;
	}
	*p = (LinkNode)malloc(sizeof(LNode));
	(*p)->Next = NULL;

}
state CreatLinklist(LinkNode *p)
{
	*p = (LinkNode)malloc(sizeof(LNode));
	(*p)->Next = NULL;
	int m;
	cin >> m;
	while (m!=00)
	{
		LinkNode L = (LinkNode)malloc(sizeof(LNode));
		L->data = m;
		L->Next = (*p)->Next;
		(*p)->Next = L;
		cin >> m;

	}
	return 1;
}
state printf(LinkNode p)
{
	LinkNode T;//因为p有头结点,所以要将头结点排除
	T = p->Next;
	int i = 1;
	while (T)
	{
		cout << T->data<<endl;
		T = T->Next;
	}
	return 1;

}
void act(LinkNode a, LinkNode b)
{
	LinkNode T;//因为p有头结点,所以要将头结点排除
	T = a->Next;
	LinkNode x;//因为p有头结点,所以要将头结点排除
	x = b->Next;
	while (T && x)
	{
		cout << T->data + x->data << endl;
		T = T->Next;
		x = x->Next;
	}
	while (T)
	{
		cout << T->data << endl;
		T = T->Next;
	}
	while (x)
	{
		cout << x->data << endl;
		x = x->Next;
	}
}

void addLinkNode(LinkNode a,LinkNode b,LinkNode *c)
{
	a = a->Next;
	b = b->Next;
	while (a->data && b->data)
	{
		LinkNode M;
		M = (LinkNode)malloc(sizeof(LNode));
		M->data = a->data + b->data;
		M->Next = (*c)->Next;
		*c = M;

		a = a->Next;
		b = b->Next;
	}
	if (a->Next!=NULL)
	{
		(*c)->data = a->data;
		(*c) = (*c)->Next;
		a = (*c)->Next;
	}
	if (b->Next!=NULL)
	{
		(*c)->data = b->data;
		(*c) = (*c)->Next;
		b = b->Next;
	}
}

int main()
{
	LinkNode a, b, p;
	InitLNode(&p);
	InitLNode(&a);
	CreatLinklist(&a);
	InitLNode(&b);
	CreatLinklist(&b);
	//printf(a);
	act(a, b);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值