实时搜索: 2017阶乘 几个0

2017阶乘 几个0

484条评论 3871人喜欢 5899次阅读 929人点赞
1.含有5的个数:[2017/5]=403
2.含有5²的个数:[2017/25]=80
3.含有5³的个数:[2017/125]=16
4.含有5ⁿ(n=4)的个数:[2017/625]=3
2017!……的个数为403+80+16+3=502
这道题的题目应该是什么啊 , c语言问题
问下各位学长学姐、fac是如何定义的、return是如何使用的(返回到了哪里)、x是如何减小的、
我刚上大一、学了几节课感觉懵了。 ...

负数的阶乘怎么算 比如-1/2的阶乘多少: 负数没有阶乘,只有-1有双阶乘,双阶乘的意思是:(2n)!=2*4*6*……*2n,(2n+1)!=1*3*5*……*(2n+1),(-1)的双阶乘是0。

分数阶乘怎么算?:

至于Γ(3/2)的值为什么是 sqrt(π)/2,这个也要到大学才能学到.
一般的x,Γ(x)是很难算出来的,只有用数值方法求积分.

阶乘符号怎么输: 盘上横排数字键6上 上边的“^”
shift+6
一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
阶乘亦可定义于整个实数(负整数除外),其与伽玛函数的关系为:
n!可质因子分解为,如6!=24×32×51。

数学 与阶乘有关 这道题的题目是什么啊: 2017!的后面有多少个0
因为2的因子远比5多,所以只要求出5的因子数就可以了。

数学符号中的叹号!什么含义: 您好!

“!”在数学中表示阶乘
阶乘
阶乘(factorial)是基斯顿·卡曼(Christian Kramp, 1760 – 1826)于1808年发明的运算符号。
阶乘,也是数学里的一种术语。
阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。 例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。
在表达阶乘时,就使用“!”来表示。如h阶乘,就表示为h!
阶乘一般很难计算,因为积都很大。
以下列出1至10的阶乘。
1!=1,
2!=2,
3!=6,
4!=24,
5!=120,
6!=720,
7!=5040,
8!=40320
9!=362880
10!=3628800
另外,数学家定义,0!=1,所以0!=1!
不过,阶乘是在自然数范围里的,小数和负数没有阶乘,像0.5!,0.65!,0.777!,-1!,-3.8!都是错误的。
阶乘的作用:
表示排列组合中的计算

为什么在 Mathematica 中使用循环是低效的: 因为在Mathematica中使用循环确实是低效的。。。。。。
深层次的原因涉及到Mathematica的底层实现所以我不太懂,但是至少从下面几个例子可以看出Mathematica里确实有很多比循环更好的方法

求和
首先举一个最简单的求和例子,求的值。为了测试运行时间取n=10^6
一个刚接触Mathematica的同学多半会这样写

sum = 0;
For[i = 1, i <= 10^6, i++,
sum += Sin[N@i]];
(*其中N@i的作用是把整数i转化为浮点数,类似于C里的double*)
sum

为了便于计时用Module封装一下,运行时间是2.13秒,如下图

然后一个有一定Mathematica经验的同学多半会知道同样作为循环的Do速度比For快,于是他可能会这么写
然后一个有一定Mathematica经验的同学多半会知道同样作为循环的Do速度比For快,于是他可能会这么写

sum = 0;
Do[sum += Sin[N@i], {i, 1, 10^6}];
sum

如下图,用时1.37秒,比For快了不少

当然了知道Do速度比For快的同学不太可能不知道Sum函数,所以上面其实是我口胡的,他应该会这么写

Sum[Sin[N@i], {i, 1, 10^6}]

如下图,同样的结果,只用了不到0.06秒

如果这位同学还知道Listable属性并且电脑内存不算太小的话,他也可能会这么写

Tr@Sin[N@Range[10^6]]

如下图,只用了不到0.02秒,速度超过For循环的100倍

当然了这只是一个最简单的例子,而且如果数据量更大的话最后一种方法就不能用了。但是这也足以说明在求和时用循环是低效的,无论是内置的Sum函数还是向量化运算,在效率上都远远高于循环
(这部分模仿了不同程序员如何编写阶乘函数这篇文章,强烈推荐对Mathematica有兴趣的同学去看看)

迭代
接下来举一个迭代的例子,(即Logistic map),取,为了测试运行时间同样取n=10^6
还是先用For循环的做法

x = 0.5;
For[i = 1, i <= 10^6, i++,
x = 3.5 x (1 - x);
];
x

如下图,运行时间2.06秒

(Do循环和For类似,篇幅所限这里就不写了,有兴趣的同学可以自行尝试)
(Do循环和For类似,篇幅所限这里就不写了,有兴趣的同学可以自行尝试)
然后看看内置的Nest函数

Nest[3.5 # (1 - #) &, 0.5, 10^6]

如下图,用时0.02秒,又是将近两个数量级的效率差异

当然了Nest的使用涉及到纯函数,对于Mathematica初学者来说可能有些难以理解,而且一些比较复杂的迭代不太容易写成Nest的形式,但是在迭代时Nest(还包括Fold)的效率确实要好于循环
当然了Nest的使用涉及到纯函数,对于Mathematica初学者来说可能有些难以理解,而且一些比较复杂的迭代不太容易写成Nest的形式,但是在迭代时Nest(还包括Fold)的效率确实要好于循环
遍历列表
依然举一个简单的例子:求一个列表中偶数的个数。为测试生成10^6个1到10之间的随机整数

list = RandomInteger[{1, 10}, 10^6];
(*生成10^6个随机整数*)

如果用For循环的话代码是这样的

num = 0;
For[i = 1, i <= 10^6, i++,
If[EvenQ@list[[i]], num++]
];
num

如下图,用时1.73秒

保留上面的思路,单纯的将For循环改为Scan (相当于没有返回结果的Map),代码如下

num = 0;
Scan[If[EvenQ@#, num++] &, list];
num

如下图,用时0.91 秒

(Do循环用时1.00秒左右,篇幅所限就不传图了)

摒弃循环的思路,用其他内置函数写

Count[list, _?EvenQ] // AbsoluteTiming
(*直接用Count数出list中偶数的个数*)
Count[EvenQ /@ list, True] // AbsoluteTiming
(*用Map对list中的每个数判断是否偶数,然后用Count数出结果中True的个数*)
Select[list, EvenQ] // Length // AbsoluteTiming
(*选取list中的所有偶数,然后求结果列表长度*)
Count[EvenQ@list, True] // AbsoluteTiming
(*利用EvenQ的Listable属性直接判断list的每个数是否偶数,然后数出结果中True的个数*)
Sum[Boole[EvenQ@i], {i, list}]
(*对list中的每个元素判断是否偶数,将结果相加*)

结果如下图

这个遍历的例子举得不算特别恰当,但也能说明一些问题了:Mathematica中内置了许多神奇的函数,其中大部分只要使用得当效率都比循环高(而且不是一点半点)。就算非要用循环,也要记得(任何能用Do代替For的时候)
这个遍历的例子举得不算特别恰当,但也能说明一些问题了:Mathematica中内置了许多神奇的函数,其中大部分只要使用得当效率都比循环高(而且不是一点半点)。就算非要用循环,也要记得(任何能用Do代替For的时候)
Do比For快
,(遍历列表时)
Scan比Do快
用向量(矩阵)运算代替循环
这个例子来自如何用 Python 科学计算中的矩阵替代循环? - Kaiser 的回答,我只是把代码从Python翻译成了Mathematica而已。选这个例子是因为它有比较明确的物理意义,而且效率对比非常明显
代码如下

AbsoluteTiming[
n = 100;
u = unew = SparseArray[{{1, _} -> 1}, {n, n}] // N // Normal;
For[k = 1, k <= 3000, k++,
For[i = 2, i < n, i++,
For[j = 2, j < n, j++,
unew[[i, j]] =
0.25 (u[[i + 1, j]] + u[[i - 1, j]] + u[[i, j + 1]] +
u[[i, j - 1]])
]
];
u = unew;
];
u1 = u;
]
(*用三重循环,迭代3000次*)
ArrayPlot[u1, DataReversed -> True, ColorFunction -> "TemperatureMap"]
(*用ArrayPlot绘图*)

AbsoluteTiming[
n = 100;
u = SparseArray[{{1, _} -> 1}, {n, n}] // N // Normal;
Do[
u[[2 ;; -2, 2 ;; -2]] =
0.25 (u[[3 ;; -1, 2 ;; -2]] + u[[1 ;; -3, 2 ;; -2]] +
u[[2 ;; -2, 3 ;; -1]] + u[[2 ;; -2, 1 ;; -3]]),
{k, 1, 3000}];
u2 = u;
]
(*用矩阵运算,迭代3000次*)
ArrayPlot[u2, DataReversed -> True, ColorFunction -> "TemperatureMap"]
(*用ArrayPlot绘图*)

运行结果For循环用时136秒,矩阵运算用时不足0.5秒,且两者答案完全一样。在算法完全相同的情况下两种写法有着超过200倍的效率差距
(图片太长了这里就不直接显示了,链接放在下面)
http://pic4.zhimg.com/65d66161f4c674b1149651c32f69935f_b.png

===========================我是结尾的分隔线===============================
这个答案其实从一开始就跑题了,还写了这么长的目的就在于希望让大家切实地感受到循环的低效并安利一下Mathematica中其它高效的方法。正如wolray的答案中说的,既然选择了使用Mathematica就应该多利用些MMA独有的美妙函数,毕竟如果只是用循环的话C和Fortran之类的语言效率比MMA不知高到哪里去了。。。。。。

然我也不是让大家就不用循环了,毕竟很多时候循环的直观性和易读性带来的便利远远比那点效率重要。只是希望大家在循环之前能稍稍想一下,自己的目的是不是
一定要用循环?可不可以用内置函数代替循环?就像上面的几个例子,将循环换成内置函数程序的简洁性和效率都大幅提高,长此以往相信你一定会爱上MMA的~

题外话——关于用编译提速循环

MMA中如果一定要使用循环又对效率有一定要求的话,可以选择使用编译,效率能有极大的提高。比如上面的第4个例子使用Complie编译过后的Do循环
用时只有1.86秒,速度提升了将近100倍。如果电脑中有C编译器的话还可以在Compile中加入CompilationTarget ->
"C"选项,速度还能有所提升。编译过后的代码如下:

In[10]:= cf = Compile[{{n, _Integer}, {times, _Integer}},
Module[{u},
u = ConstantArray[0., {n, n}];
u[[1]] = ConstantArray[1., n];
Do[
Do[u[[i, j]] =
0.25 (u[[i + 1, j]] + u[[i - 1, j]] + u[[i, j + 1]] +
u[[i, j - 1]]),
{i, 2, n - 1}, {j, 2, n - 1}
], {k, 1, times}];
u
]
];
u3 = cf[100, 3000]; // AbsoluteTiming
ArrayPlot[u3, DataReversed -> True, ColorFunction -> "TemperatureMap"]

Out[11]= {1.86055, Null}

前3个例子也都可以通过编译提速很多,这里就不放代码了,有兴趣的同学可以自己动手试一试,如果遇到问题欢迎在评论中与我交流。
需要注意的是编译有很多注意事项,这里推荐一篇写的很好的教程,编译中常见的问题里面都有很好的讲解:怎样编译(Compile)/编译的通用规则/学会这6条,你也会编译
但是一般来讲编译很麻烦,而且再怎么编译效率也很难赶上直接用C,所以个人并不特别建议MMA初学者学习编译。

c语言问题 问下各位学长学姐、fac是如何定义的、return是如何使用的(返回到了哪里)、x是如: #include <stdio.h>

//在使用前要先对函数进行声明 
long fac(int);

int main(void)
{
int n;
long ff;
scanf("%d",&n); 
ff = fac(n);
printf("%d!=%d\n",n,ff);
return 0;
}

//这里就是fac() 
long fac(int x)
{
long f;
if(x == 0 || x== 1)
f = 1;
else
//这里又调用了fac()自己,叫做递归调用
//每次调用时都是将x-1赋给下一个fac()
f = fac(x-1) * x;
//return会把值返回到调用它的函数中去 
return f;
}
//主要是要理解这个递归的过程 
//假设输入的是3,过程是这样的:

数学中概率计算的公式都有哪些?: 1.排列及计算公式

从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 p(n,m)表示.

p(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(规定0!=1).

2.组合及计算公式

从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号

c(n,m) 表示.

c(n,m)=p(n,m)/m!=n!/((n-m)!*m!);c(n,m)=c(n,n-m);

3.其他排列与组合公式

从n个元素中取出r个元素的循环排列数=p(n,r)/r=n!/r(n-r)!.

n个元素被分成k类,每类的个数分别是n1,n2,...nk这n个元素的全排列数为

n!/(n1!*n2!*...*nk!).

k类元素,每类的个数无限,从中取出m个元素的组合数为c(m+k-1,m).
排列(Pnm(n为下标,m为上标))

Pnm=n×(n-1)....(n-m+1);Pnm=n!/(n-m)!(注:!是阶乘符号);Pnn(两个n分别为上标和下标) =n!;0!=1;Pn1(n为下标1为上标)=n

组合(Cnm(n为下标,m为上标))

Cnm=Pnm/Pmm ;Cnm=n!/m!(n-m)!;Cnn(两个n分别为上标和下标) =1 ;Cn1(n为下标1为上标)=n;Cnm=Cnn-m

  • dnf女剑士的导师是谁

    穿越火线手游职业选手用哪种操作: 应该是直接在屏幕上操作,因为如果用其他辅助的物品可能是犯规,如果你熟练PC版CF你在PE上野战或者排位可以在电脑上下载安卓模拟器在电脑上玩,或者也可以用手柄。 ...

    363条评论 3260人喜欢 1902次阅读 540人点赞
  • 360wifi可以几个人用

    说说穿越火线里的大炮和普通狙比起来有哪些好处,为啥大炮用起来那么有手感,一直不知道原因,: 很多人觉得cf里的大炮比较鸡肋。。除了打生化没什么大用。。爆破里很多人选择花狙而不选择大炮。。因为大炮太重了。。。(队里幽灵高手说拿炮用鬼跳飘起来就不觉得怎么地了。。但我试的时候拿炮根本飘不起来。。可能是我水平太次了...

    770条评论 1628人喜欢 2115次阅读 213人点赞
  • 2015比特币多少钱一个

    女孩问男孩有没有宗教信仰,什么意思: 应该是想问问了解下,你直接说就好啦,这是人和人之间的一种共同话题,你问下,她很有可能有,我建议你问她,在回复她 ...

    589条评论 5179人喜欢 3455次阅读 650人点赞
  • 昆明火车站砍人是谁

    我CF很垃圾,玩挑战最多只能刷青铜,刷两个青铜都费力.哪位高手能教我些秘籍,让我刷点白银箱.: 简单办法。用M60 点射,往僵尸头上开枪。爆头分值会高。子弹多,雷要用到妙处。刚开始的时候大家都是这样。 ...

    949条评论 1285人喜欢 6053次阅读 875人点赞
  • htc内存卡在哪个文件夹

    穿越火线枪战王者三周年头像框现在在哪里得: 活动过期了 没有了 要在三周年当天才能领取 ...

    787条评论 4670人喜欢 2465次阅读 780人点赞
  • pr怎么复制效果

    河南省南阳市社旗县修路占地该补偿多少钱: 俺庄地占了都没给钱, ...

    777条评论 1026人喜欢 4381次阅读 318人点赞