zoukankan      html  css  js  c++  java
  • c++:计算阶乘的准确值

    摘自:http://blog.sina.com.cn/s/blog_9e0097f701010ve5.html

    题目要求:输入不超过1000的正整数n,输出n=1*2*3*...*n的精确结果。

        样例输入:30

        样例输出:265252859812191058636308480000000

    程序源代码:

         #include<stdio.h>
         #include<string.h>
         #define MAX 3000
         int a[MAX];
         int main()
        {
          int i,j,n;
          memset(a,0,sizeof(a));
          scanf("%d",&n);
          a[0]=1;
          for(i=2;i<=n;i++)
          {
            int c=0;
            for(j=0;j<MAX;j++)
            {  
             int s=a[j]*i+c;
             a[j]=s % 10;
             c=s/10;
            }
          }
         for(j=MAX-1;j>=0;j--) if(a[j])  break;//忽略前导0
         for(i=j;i>=0;i--) printf("%d",a[i]);
         printf("\n");
         return 0;
        }

    分析:

        999!是个很大的数字,普通的数据类型肯定无法储存,我们可以用整型数组来储存这个数字,a[0]保存结果的个位,a[1]保存十位,a[3]保存百位.....。注意数组是按结果的逆序保存的,这样的话就可以模拟手算进行计算,可以进行进位的处理,对于每一个i:1.i与个位相乘加进位c(开始设为0)后对10取余得到运算后个位应得的结果 2.对10取整得到进给十位的数字c 3.i与十位相乘加进位c后对10取余得到运算后十位应得的结果

    。4如此往复直到i=n运算完毕。

       要储存这个大数,就要先知道这个数有多少位,数组的长度要大于位数。1000!=4*10^2567。

       还要注意数组的最后可能有很多0,所以输出结果时要忽略后面的所有0,把数组逆序输出。

  • 相关阅读:
    论文复现的一些问题
    南京锐士方达猎头可拉黑
    Functional Ruby
    国内访问 Atom 源很慢 & 解决方案
    Linux 的硬链接与软链接
    Python小知识点(持续更新)
    MySQL小知识点(持续更新)
    Iterable Object, Iterator, Generator, Generator Iterator
    setTimeout函数在浏览器中和Node.js中的区别
    Several Python Tools/Utilities
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/2943071.html
Copyright © 2011-2022 走看看