计算2015!(C++)

2015!即使用unsigned long long int  也会溢出, 因此在c++只能用字符串来储存;

VS2010下测试通过;

VS2013需要在最开头加上;

#define _CRT_SECURE_NO_DEPRECATE

否则会提示:错误 1 error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

由于VS2013会认为'strcpy()函数不安全而不能执行;

代码长度不算太长,不过优化做的太次;

没加注释,静下心来应该能看懂;

提示:这段代码中为了计算方便数字是倒着存的,例如数字123会被存为 ‘3’  ‘2’  ‘1’;

#include<iostream>
#include<memory.h>
#include<cstring>
using namespace std;
char s1[8000], s2[8000];
int main()
{
	char a[10];
	memset(s1, '0', sizeof(s1));
	memset(s2, '0', sizeof(s2));
	s1[1] = '1';
	for (int i = 1; i <= 2015; i++)
	{
		int temp = i;
		int k = 1;
		memset(a, '0', sizeof(a));
		while (temp != 0)
		{
			a[k] = temp % 10 + '0';
			temp = temp / 10;
			k++;
		}

		temp = 0;
		for (k = 1; k <= 4; k++)
		{
			for (int j = 1; j <= 7999; j++)
			{
				temp = temp + (s1[j] - '0')*(a[k] - '0');
				s2[j + k - 1] += (temp % 10);
				if (s2[j + k - 1] >= ('0' + 10))
				{
					s2[j + k - 1] -= 10;
					s2[j + k]++;
				}
				temp = temp / 10;
			}
		}
		strcpy(s1, s2);
		memset(s2, '0', sizeof(s2));
	}
	int i = 7999;
	while (s1[i] == '0')
	{
		i--;
	}
	for (int j = i; j >= 1; j--)
	{
		cout << s1[j];
	}
	return 0;
}


优化过的代码如下:

  
#include<iostream>
#include<memory.h>
#include<cstring>
#include<cmath>
#include<stdio.h>
using namespace std;
char s1[18450], s2[18450];
int main()
{
char a[10];
double length = 1;


memset(s1, '0', sizeof(s1));
memset(s2, '0', sizeof(s2));
s1[1] = '1';
int x;
cin >> x;
for (int i = 1; i <= x; i++)
{
int temp = i;
int k = 1;
memset(a, '0', sizeof(a));
while (temp != 0)
{
a[k] = temp % 10 + '0';
temp = temp / 10;
k++;
}


temp = 0;
length += log10(i);
for (k = 1; k <= 4; k++)
{
for (int j = 1; j <= (int)length; j++)
{
temp = temp + (s1[j] - '0')*(a[k] - '0');
s2[j + k - 1] += (temp % 10);
if (s2[j + k - 1] >= ('0' + 10))
{
s2[j + k - 1] -= 10;
s2[j + k]++;
}
temp = temp / 10;
}
}
strcpy(s1, s2);
memset(s2, '0', sizeof(s2));
}
unsigned long long int i = sizeof(s1);
i--;
while (s1[i] == '0')
{
i--;
}
for (int j = i; j >= 1; j--)
{
printf("%c", s1[j]);
}
cout << endl;
return 0;
}        


PS:如果用Java的大数类,可以很轻松的解决这类大数问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值