计算2015!(C++)

来源:互联网 发布:vim node inspector 编辑:程序博客网 时间:2024/06/05 14:30

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的大数类,可以很轻松的解决这类大数问题。

0 0