求n!的左边第二位数字?

donald_xmli 2005-10-12 10:29:00
问题如标题。
输入:n(n >= 4)
输出:n!的左边第二位数字。

例:
(1)
4!= 24,
输入:4
输出:4。
(2)
5! = 120
输入:5
输出:2。
求算法。
...全文
230 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cosio 2005-10-13
  • 打赏
  • 举报
回复
我没有判断N>=4的情况
Private Sub Command1_Click()
if val(text1.text)<4 then exit sub
Call Multi(Val(Text1.Text))
Text2.Text = Mid(Sum, 2, 1)
End Sub
cosio 2005-10-13
  • 打赏
  • 举报
回复
Dim Sum As Long
Private Sub Command1_Click()

Call Multi(Val(Text1.Text))
Text2.Text = Mid(Sum, 2, 1)
End Sub


Private Function Multi(ByVal n As Long)
Sum = 1
Do While (n > 0)
Sum = n * Sum
n = n - 1
Loop
End Function

VB算法!
yj9853051 2005-10-13
  • 打赏
  • 举报
回复
cosio程序(不是算法)对n 比较小是可以的 n>50基本上不行的
mmmcd 2005-10-12
  • 打赏
  • 举报
回复
A = S的取整 mod 10
mmmcd 2005-10-12
  • 打赏
  • 举报
回复
假设n!有k位数(k>2 k=[lg(n!)]+1 )
左边二位数 S = n!/10^(k-2)

lg S = lg(n!)-(k-2) = lg(n!)-[lg(n!)]+1

S = 10^(lg(n!)-[lg(n!)]+1)

左边第二位数 A = S mod 10


#include <stdio.h>
#include <math.h>

double lf(int n){
int i;
double r=0;
for(i=2;i<=n;i++)
r+=log(i)/log(10);
return r;
}

int main()
{
int n,a;
double k;
while(scanf("%d",&n)){
k=lf(n);
if(k>2){
a=(int)(pow(10,k-(int)k+1)+1e-10);
printf("%d\n",a % 10);
}
else{
a=(int)(pow(10,k)+1e-10);
printf("%d\n",a %10);
}
}
return 0;
}
gxqcn 2005-10-12
  • 打赏
  • 举报
回复
这比求最后一位非零数简单多了!

只需计算出 n! 足够的有效位即可,有著名的 Stirling's series :
n! = sqrt(2*pi) * n^(n+1/2) * e^(-n) * ( 1 + 1/12*n^-1 + 1/288*n^-2 - 139/51840*n^-3 + ... )
yelling 2005-10-12
  • 打赏
  • 举报
回复
计算中丢弃位数,保留一定的精度,最后取第二位。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧