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;        return 0;    }    for(int i = n; i >= 1; i--){        for(int j = 0; j <= count; j++){            a[j] *= i;        }        for(int j = 0; j <= count; j++){            if(a[j] > 10){                    while(a[j] >= 10){                    a[j] -= 10;                    a[j + 1]++;                }            }        }        while(a[count]){            count++;        }            }    for(int i = count - 1; i >= 0; i--)        cout << a[i];    return 0;} 上面代码最多只能跑出18的阶乘。下面的代码是可行的:#include <iostream>using namespace std;

int main(){    int a[1000] = {1};    int len = 1;    int n, q = 0;    cin >> n;  if(n == 0){  //注意0的阶乘是1    cout << 1;    return 0;}    for(int i = 1; i <= n; i++){        q = 0; //每次要置零         for(int j = 0; j < len; j++){            a[j] = a[j] * i + q;            q = a[j] / 10;            a[j] = a[j] % 10;        }        if(q > 0){            a[len] += q; //加上退出前进位             len++;        }    }    for(int i = len - 1; i >= 0; i--)        cout << a[i];    return 0;}
时间: 2024-12-21 13:40:47

4.n的高精度阶乘---优化的相关文章

中石油-高精度阶乘-java

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

【高精度】高精度阶乘

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

高精度加法的优化

改善高精度运算的效率 •以上接触到的高精度存储方法是用一个整型数组来表示一个很大的数,数组中的每一个数表示一位十进制数字.但这种方法的缺点是,如果十进制数的位数很多,则对应数组的长度会很长,并增加了高精度计算的时间.那么有什么方法可以改善高精度运算的效率呢? •我们可以考虑用一个数记录2位数字.3位数字或更多位数字.理论上来说,数组中的每个数表示的数字越多,数组的长度就越短,程序运行的时间也就越短.但是,我们还需考虑到计算机中的一个数的取值范围,必须保证它们在运算过程中不会越界.在权衡了两方面的

高精度阶乘的运算

阶乘: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;

算法:高精度阶乘

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

高精度阶乘

#include<stdio.h>#include<string.h>const int maxn=3000;int f[maxn];int main(void){ int i,j,n; scanf("%d",&n); memset(f,0,sizeof(f)); f[0]=1; for(i=2;i<=n;i++) { int c=0; for(j=0;j<maxn;j++)//f[]中的每个数的都乘i { int s=f[j]*i+c; f

高精度:阶乘之和

题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50)S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5×4×3×2×1 输入格式 一个正整数NNN. 输出格式 一个正整数SSS,表示计算结果. 输入输出样例 输入 #1  3 输出 #1  9思路:用到了两种高精度,阶乘高精度和加法高精度.高精度阶乘有两种代码: 1 void JieCheng(int a[], int c) 2 { 3 for (int i =

8617&#160;阶乘数字和

时间限制:500MS  内存限制:1000K 提交次数:224 通过次数:64 题型: 编程题   语言: C++;C Description 我们知道一个数的阶乘n! = 1*2*……*n一般是一个很大的数.现在要计算的是一个数阶乘之后得出来的数所有位上的数字相加的和. 输入格式 输入为多case输入.每个case只有一行,输入一个正整数n(1<=n <= 50),当输入0时结束 输出格式 一个整数. 输入样例 5 2 0 输出样例 3 /*这里模拟了大数乘法来计算高精度阶乘*/ #incl