| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1625 人关注过本帖
标题:任意位数的高精度阶乘算法
取消只看楼主 加入收藏
SLYAR
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-9-4
收藏
 问题点数:0 回复次数:0 
任意位数的高精度阶乘算法
大家给指点一下,看看哪里还需要改进。

windows xp dev c++ 4.9.9.2 编译通过

程序代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/* 求N!的位数公式 log10(1)+log10(2)+···+log10(n) 取整加1  */
int wei(int n){
    int i;
    double sum=0;
    for(i=1;i<=n;i++) sum+=log10((double)i);
    /* 以万为进制,一位可以表示4个数,减少存储空间 */
    return (int)((sum+1)/4+1);
}

/* 高精度阶乘核心 */
int main(){
    int i,j,n,jinwei,weishu=1,temp;
    unsigned int *x;
    scanf("%d",&n);
    /* 依据阶乘位数申请动态数组 */
    x=(unsigned int*) malloc(wei(n)*sizeof(int));
    x[0]=1;
    for(i=2;i<=n;i++){
        jinwei=0;
        for(j=1;j<=weishu;j++){
            temp=x[j-1]*i+jinwei;
            if (temp>=1){
                /* 以万为进制,提高运算速度 */
                x[j-1]=temp%10000;
                jinwei=temp/10000;
            }
        }
        while(jinwei){
            weishu++;
            x[weishu-1]=jinwei%10000;
            jinwei/=10000;
        }
    }
    /* 先输出第一个数,防止首位出现0 */
    printf("%d",x[weishu-1]);
    /* 输出其余的数,因为万进制,需要补0 */
    for(j=weishu-2;j>=0;j--) printf("%04d",x[j]);
    /* 释放申请的内存 */
    free(x);
    system("pause");
    return 0;
}
搜索更多相关主题的帖子: 算法 阶乘 位数 
2008-10-03 23:36
快速回复:任意位数的高精度阶乘算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026096 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved