(进制)51NOD 1057 N的阶乘

输入N求N的阶乘的准确值。
 
Input
输入N(1 <= N <= 10000)
Output
输出N的阶乘
Input示例
5
Output示例
120
解:这其实是MOD进制,将一个int或者long long数据类型作为一个数位,满MOD进一(本题中MOD=1000000000)。
(注意选择合适的数据类型,避免计算过程中数据溢出。)
 1 #include <stdio.h>
 2 
 3 #define MOD 1000000000
 4 
 5 int a[50000];
 6 
 7 int main()
 8 {
 9     int n;
10     while (scanf_s("%d", &n) != EOF)
11     {
12         int j = 0;
13         a[0] = 1;
14         while (n > 1)
15         {
16             long long temp = 0;
17             int add = 0;
18             for (int i = 0; i < j + 1; i++)
19             {
20                 temp = 1ll * a[i] * n + add;
21                 add = temp / MOD;
22                 a[i] = temp % MOD;
23             }
24             if (add) a[++j] = add;
25             n--;
26         }
27         printf("%d", a[j]);
28         while (j--) printf("%09d", a[j]);
29         printf("\n");
30     }
31     return 0;
32 }

 

讲一些别的:

1.常量数据也有其相应的数据类型,计算过程中要注意转化。如:long long m = 1000000000 * 10;这样赋值就会产生错误,因为1000000000 和10都缺省int类型。

  两种改进方法:① 强制转化 long long m = (long long)1000000000 * 10;

         ②用乘法改变数据类型 long long m =1ll*1000000000 * 10;

         ③使用long long类型数据常量 long long m =1000000000ll * 10;

在一些时候这三种方法其实是一样的方法,方法一中类型转化运算符比*(乘法)优先级高,故1000000000先被转化为1000000000ll(long long 类型)再与10乘;方法二中用乘法将1000000000转化为1000000000ll(long long 类型)再与10乘。

这样的转化中一定要注意在数据溢出前进行,如: long long m = (long long)(1000000000 * 10);和 long long m = 1000000000 * 10 * 1ll;就是错误的。

2.斯特林公式

斯特林公式(Stirling's approximation)是一条用来取n的阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。————《百度百科》

 

posted @ 2018-09-12 09:05  Ekalos  阅读(415)  评论(0编辑  收藏  举报