计算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的大数类,可以很轻松的解决这类大数问题。
- 计算2015!(C++)
- 计算行列式(C++)
- 计算文件MD5 (C++)
- 表达式计算(栈/c++)
- 计算天数(c语言)
- 计算程序的运行时间(C++)
- 精确计算100的阶乘(C++)
- 蒙特卡罗算法计算圆周率PI(C++)
- C++(MFC)快速计算质数
- 计算程序的运行时间(C++) .
- c指针、数组(计算大小)
- CodeForces 618 C. Constellation(计算几何)
- 根据生日计算星座(Objective-C)
- 矩阵乘法计算脚本代码(C#)
- 埃尔米特函数的计算(C++)
- C语言(21)日期计算
- linux 计算CPU使用率(C代码)
- 计算火车运行时间(c语言)
- hdu 1452 (积性函数+因子和+乘法逆元)
- 最大三角形
- 开启Linux学习之旅
- 用户注册验证
- JavaScript BOM 相关知识
- 计算2015!(C++)
- Coding_iOS客户端项目介绍
- 华为机试—删除连续出现大于等于3的数字
- rman备份
- js面向对象
- LeetCode---Remove Nth Node From End of List
- Objective-C中copy 、retain以及ARC中新加入的strong、weak关键字的含义
- JavaScrpt 全局属性与函数
- Cocos2d-html5 搭建开发环境,运行 Hello World,JetBrains IDE Support