超精度运算之大整数求阶乘

来源:互联网 发布:女程序员会嫁什么人 编辑:程序博客网 时间:2024/05/22 00:37

网上也有很多讲解,,可以看了很多感觉网上写的真的很乱、很难理解,于是自己琢磨了两个多小时改了又改终究是写出了蛮简单的代码,希望阅读者能受益。

代码贴上:

#include <bits/stdc++.h>using namespace std;void factorial( int n , vector <int> &p ){//反序存储以适应计算习惯,即例如数值为52032是以23025顺序存进vecter里边的。    int i=2;    p.push_back( i );    for( i=3; i<=n; ++i ){// N ! = 2*3*4*…*(N-1)*N . 此循环为遍历因子        for(unsigned  int j=0; j<p.size(); ++j){            if( 0==p[ j ] ) continue; //末位值为0不需要再乘,优化代码            p[ j ] *= i ;//必须先把临时结果值逐位都乘上 i ,先有各个位数上的值动态改变        }        for(unsigned  int j=0; j<p.size(); ++j){//然后再处理进位问题            if( p[j] > 9 ){//用if不用while,p[j]%=10一步到位                if( j == p.size() - 1  ) {                    p.push_back( p[ j ] / 10 ) ; //进位,插入进位值                    p[ j ] %= 10 ; //注意计算顺序不能搞混!                }                else{                    p[ j+1 ] += ( p[ j ] / 10 ) ;                    p[ j ] %= 10 ;                }            }         }    }    for(  i=p.size()-1; i>=0; --i )        printf("%d",p[i]);    printf("\n%d\n",p.size());    p.clear();}int main(){    int num;    vector <int> fac;    while( scanf("%d",&num) != EOF){        if(num < 0 )    printf("Input Error ! Try one more time please !\n") ;        else if( num <=1 )  printf("1\n") ;        else            factorial( num, fac ) ;    }    return 0;}


另外,附上自己看了感觉还蛮好的两篇文章。

一位老师写的总结点击打开链接

http://www.doc88.com/p-3456723655573.html

还有就是阶乘列表点击打开链接

http://blog.csdn.net/lzmtw/article/details/1344490


欢迎指教!!


0 0
原创粉丝点击