| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 818 人关注过本帖
标题:高手请进 阶乘的精度值问题
只看楼主 加入收藏
转身
Rank: 2
等 级:论坛游民
帖 子:58
专家分:25
注 册:2010-1-4
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:7 
高手请进 阶乘的精度值问题
输入30 输出为:265252859812191058636308480000000  这个程序到底哪里求阶乘了?下面的红色字体是什么意思?真晕 谢高手指点 给分一定合理
#include<stdio.h>
#include<string.h>
const int maxn=3000;
int f[maxn];
int main()
{int i,j,n;
    scanf("%d",&n);
    memset(f,0,sizeof(f));
    f[0]=1;
    for(i=2;i<=n;i++)
{int c=0;
    for(j=0;j<maxn;j++)
    {int s =f[j]*i+c;
        f[j]=s%10;
        c=s/10;
    }
}
for(j=maxn-1;j>=0;j--)
if(f[j]) break;
for(i=j;i>=0;i--)
printf("%d",f[i]);
printf("\n");
return 0;
}
搜索更多相关主题的帖子: 精度 阶乘 
2010-01-31 17:30
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
红色部分是把数组清0用的。

双层 for 循环的部分是求阶乘的。
后面的部分是在打印结果。
2010-01-31 18:31
Devon_Ye
Rank: 4
来 自:广东
等 级:业余侠客
帖 子:124
专家分:282
注 册:2010-1-7
收藏
得分:0 
红色字体部分:把从数组f开始共sizeof(f)大小的一块内存全部清0.  

楼上的,能否把求阶乘的算法解释下

PS: printf("%d",f[i]);
    输入30,输出265252859812191058636308480000000,
    整形不能输出这么大的数啊,是溢出吗?
2010-01-31 18:40
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
大数存不下,所以是用数组模拟的。
他的方法是一位一个数。然后就是循环把小于 n 的数一个个乘起来。

其实列个竖式就看出来是怎么乘的了,就比如算 30! 比如乘到第 23 次了,那就是 22! * 23。我假设 22! = 12345。
     23
* 12345
-------
    115 (23 * 5)
.......
这时,个位数是 5 是肯定的了(所以就把它存起来,f[j] = s%10,就是把个位存下来),
前面的部分要参与进位,c = s/10 是把前面的存在c里。再往下看:
     23
* 12345
-------
    115
    92  (23 * 4)
......
这时,92 + 11 是 103。这时十位是 3 就是肯定的了。前面的还是要继续参与进位,如此循环下去。

把这个竖式乘法想清楚,之后基本就能編这个阶乘了。
2010-01-31 18:53
转身
Rank: 2
等 级:论坛游民
帖 子:58
专家分:25
注 册:2010-1-4
收藏
得分:0 
4楼的兄弟
    23
* 12345
-------
    115 (23 * 5)
.......
这时,个位数是 5 是肯定的了
中23*5是什么意思啊?干什么用呢?


     23
* 12345
-------
    115
    92  (23 * 4)
......
这时,92 + 11 是 103。这时十位是 3 就是肯定的了
中92+11干嘛啊? 这个竖式还是不懂啊

没有谁对谁错,只有谁不懂得珍惜
2010-02-01 09:05
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
可能我说的不太清楚,竖式乘法不是这样的吗:

    23
*  123
------
    69
   46
+ 23
------
  2829

你自己在草稿纸上算一个,如果写的和我不一样,那就是小学时学的就不一样。不过没关系,应该也能看懂我的。

看最终结果的 2829 中,个位数的 9 就是 69 的时候算出来的,后面的几次乘法不管是什么结果是不是不影响了?9 就是最终结果,6 要去进位。
还有十位的 2 ,是算 46 的时候算出来的。46 加上之前算 69 时进上来的 6,就变成了 52。这时的 2 就是十位的最终结果。5 要去进位。

我当时写的 (23 * 5) 是怕有的人不知道我这个 115 是怎么来的,注上去的而已,跟竖式没有关系。
2010-02-01 09:35
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
我再补充两句吧,这个竖式算法跟人算的时候还是有点区别,人加十位的时候是不是只把那个个竖着的 6 加起来,然后往百位进 1 ?那是因为我们把 69, 46, 23 全乘出来之后才开始加的。电脑算到比如 46 的时候,后面的 23 还没算,所以有时候不能这么干(而且这么干明显比较麻烦)。

[ 本帖最后由 pangding 于 2010-2-1 09:42 编辑 ]
2010-02-01 09:40
转身
Rank: 2
等 级:论坛游民
帖 子:58
专家分:25
注 册:2010-1-4
收藏
得分:0 
非常感谢

没有谁对谁错,只有谁不懂得珍惜
2010-02-01 10:17
快速回复:高手请进 阶乘的精度值问题
数据加载中...
 
   



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

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