高精度阶乘的运算

阶乘:1x2x3x4.....N,仿照2的N次方的手法,只不过这次从前往后计算,得到的数从左往后,依次为个位十位百位...等等。
例如:021,表示120

#include <iostream>
using namespace std;
#define max 100
/*保存结果的数组长度*/
int f[max];
int main()
{
     int n=10; /*n表示n!,自由修改*/
     f[0] = 1;
     for(int i = 2;i <= n;i++)
     {
          int c = 0;/*进位值*/
          for(int j = 0;j < max;j++)/*整个数组乘一遍*/
              {
                   int s = f[j] * i + c;
                   f[j] = s % 10;
                   c = s / 10;
             }
     }
     for(int k = max - 1;k >= 0;k--) /*扫描清除右边的0*/
     if(f[k]) break;
     for(i = k;i >= 0;i--) /*从右往左打印结果*/
     cout<<f[i];
     return 0;
}

这个算法的一个缺点是,每次都要把数组乘一遍,有什么办法能优化它呢?

时间: 2024-11-29 12:07:15

高精度阶乘的运算的相关文章

中石油-高精度阶乘-java

问题 F: [高精度]高精度阶乘 时间限制: 1 Sec  内存限制: 64 MB提交: 49  解决: 13[提交][状态][讨论版] 题目描述 <魔法宝典>对于修罗王是如此重要,是因为<宝典>里记载了很多匪夷所思的魔法原理.例如很久以前,主流魔法界认为传说中的隐身衣是无法实现的,他们的理论是光线进入人的眼睛才能引起视觉,如果有隐身衣存在,则其中的人由于没有光线进入眼中也就看不见外面的情况.但是后来横空出世的<宝典>里却详细叙述了数种隐身衣的实现原理并成功地将之实现.

【高精度】高精度阶乘

问题 F: [高精度]高精度阶乘 时间限制: 1 Sec  内存限制: 64 MB提交: 297  解决: 58[提交] [状态] [讨论版] [命题人:] 题目描述 <魔法宝典>对于修罗王是如此重要,是因为<宝典>里记载了很多匪夷所思的魔法原理.例如很久以前,主流魔法界认为传说中的隐身衣是无法实现的,他们的理论是光线进入人的眼睛才能引起视觉,如果有隐身衣存在,则其中的人由于没有光线进入眼中也就看不见外面的情况.但是后来横空出世的<宝典>里却详细叙述了数种隐身衣的实现原

N的阶乘(大数运算)

对于一个大数来说,一个数的阶乘是非常大的.同样,一个int类型的整数,它的阶乘可能会很大.就拿50来说,它的阶乘位数是65位,就已经远远超出了long long int类型的最大值.这个时候,就要通过字符串的方法来进行阶乘的运算. 1 * 2 2                   s = 1*2 = 2, array[0] = 2, up = 0 1 * 2 * 3 6                   s = 2*3 = 6, array[0] = 6, up = 0 1 * 2 * 3

高精度计算(二) /*高精度的加法运算*/

例 高精度加法运算 输入正整数 a 和 b,输出 a+b 的值.0<a,b<=10^250 输入: 第一行:a 第二行:b   输出:a+b 的和. 样例输入: 99    999 样例输出: 1098 分析: (1)加法运算      -- a[7]  a[6]  a[5]  a[4]  a[3]  a[2]  a[1] -+-   0      0    b[5]  b[4]  b[3]  b[2]  b[1] ----------------------------------    

算法:高精度阶乘

问题描述:        输入一个正整数n,输出n!的值,这里的阶乘结果必须是完全准确的,每一位都需要被精确输出,而且这里的计算结果有可能会非常巨大,超过计算机中的任何数据类型.        阶乘的计算公式:n!=1*2*3*…*n. 解题思路:        对于高精度要求的计算,我们一般的思路是如何准确拆解并分析每一个最小元素,如何精确保存每一位元素,最终又如果把它们揉合成一个整体.        对于这一个问题,我们的首要思路是:            1. 把最大元素拿来做每位拆分,并

4.n的高精度阶乘---优化

题目:对于每组测试数据,在一行中给出一非负整数n(n小于等于100) 样例输入 3 5 10 样例输出 6 120 3628800 超时的代码如下:#include <iostream>#include <cstring>using namespace std; int main(){    int n, count = 0;    int a[100] = {1};    cin >> n;    if(n == 0){        cout << 1;

51nod 1057 N的阶乘 (大数运算)

输入N求N的阶乘的准确值. Input 输入N(1 <= N <= 10000) Output 输出N的阶乘 Input示例 5 Output示例 120 压位: 每个数组元素存多位数字 1 #include <cstdio> 2 #include <string> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmat

EOJ 3037: 十六进制加法(高精度+数组位运算)

一.思路: 1.字符数组读入,整形数组存储,字符数组输出 2.类似于十进制大数加法,用整型数组模拟运算:总使得长度长的字符串作为s1,这涉及到字符数组交换 3.每次结束时清空整型数组 二.注意点: 1.读取时采用: scanf("%s%s",s1+1,s2+1); 获取字符串长度采用: len1=strlen(s1+1); len2=strlen(s2+1); 交换字符串采用: char temp[205]; strcpy(temp+1,s1+1); strcpy(s1+1,s2+1)

用C++实现:高精度阶乘

问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*…*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推. 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位. 首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值. 输入格式 输入包含一个正整数n,n<=1000. 输出格式 输出n!的准确值. 样例输入 10 样例输出 3628