[专栏]【算法入门】(1)大数据 溢出引起的思考

例:求 1!+2!+3!+...+n! 的低3位。


最原始的方法:

#include <stdio.h>

int main()
{
const int MOD=100;//求低三位
int i,j,n,s=0;

scanf("%d",&n);
for (i=1;i<=n;i++)
{
int factorial=1;
for (j=1;j<=i;j++)
factorial*=j;
s+=factorial;
}

printf("%d\n",s%MOD);

return 0;
}

这种方法对 较少的数来说没有问题。 但是 稍微大一些的数 例 30 得出的 -7. 很显然溢出。


这里介绍简单方法。

中间循环改为

for (i=1;i<n;i++)
{
int factorial=1;
for (j=1;j<=i;j++)
{
factorial=(factorial*j%MOD);
}
s=(s+factorial)%MOD;
}

printf("%d",s); //此时的s即为 最终结果

关键算法 一:factorial=(factorial*j%MOD); 因为 只考虑第三位 ,每个乘积只需考虑第三位的乘积 即可,所以,每次循环得到的 乘积都进行%MOD

关键算法 二: s=(s+factorial)%MOD 将所有数阶乘的第三位求和,求总和的第三位,因为总和仍可能 超高3位,所以每次的求和 也都进行 %MOD


这样做的目的是为了保证每次都存储较少的,且有用的数据位。


以上是自己的一点理解,希望对大家有帮助,有想法的欢迎交流意见。


你可能感兴趣的:(大数据)