99的階乘分析
主要是分析一些特征,當(dāng)然這里可能先不會(huì)直接去求這個(gè)數(shù)
這個(gè)數(shù)字末尾有0嗎,如果有,數(shù)量是多少
可能99!太復(fù)雜,一般先分析簡(jiǎn)單的。比如5!,6!,7!,8!
5!=54321=120 結(jié)尾是1個(gè)0
8!=87654321=40320
這里面特征就是這個(gè)數(shù)可以被5整除嗎?
比如120=54321中有1個(gè)5則結(jié)尾就是1個(gè)0,8也是一樣只有1個(gè)5.
當(dāng)然如果是10也可以,比如3628800=10987654321含有1個(gè)5,
1個(gè)10,則被5整除的數(shù)字有2個(gè),3628800結(jié)尾就是有2個(gè)0
實(shí)際上125這種還要處理一下,125*4=600是有2個(gè)0的,對(duì)于125/5=25還能繼續(xù)被5整除,也就是25/5=1也是可以的
參考代碼如下:
int countFactorial0Size(int data) {
int sum = 0;
for (int i = 1; i <= data; i++) {
int tmp = 0;
int count = i;
while (count % 5 == 0) {
count = count / 5;
tmp++;
}
sum += tmp;
}
return sum;
}
這個(gè)數(shù)字的二進(jìn)制末尾有0嗎,如果有,數(shù)量是多少
繼續(xù)分析二進(jìn)制特點(diǎn)比如十進(jìn)制11對(duì)應(yīng)的二進(jìn)制也就是1011,末尾是1,所以末尾1個(gè)0都沒(méi)有,對(duì)于奇數(shù)特點(diǎn)就是末尾是1,所以奇數(shù)末尾一個(gè)0都沒(méi)有啦
分析偶數(shù)比如8,二進(jìn)制是1000,末尾3個(gè)0,可以通過(guò)右移3位得出數(shù)字末尾是1了;
分析10呢,對(duì)應(yīng)二進(jìn)制是1010,通過(guò)右移1位得出數(shù)字末尾是1了;
右移1位代表除以2,那么1010,看看這個(gè)數(shù)能被2除以幾次呢?如果是10,除以2就變成奇數(shù)了,也就是二進(jìn)制第一位是1了,說(shuō)明10的二進(jìn)制末尾只有1個(gè)0;
所以10的階乘,1098765432*1,看看這個(gè)數(shù)字除以2到什么時(shí)候才會(huì)
變成奇數(shù),除以1次說(shuō)明二進(jìn)制末尾1個(gè)0,除以10次末尾就有10個(gè)0
參考代碼:
int countFactorBinZeroSize(int data) {
int sum = 0;
for (int i = 1; i <= data; i++) {
int tmp = i;
int count = 0;
while ((tmp & 1) == 0) {
count++;
tmp = tmp >> 1;
}
sum += count;
}
return sum;
}
找到這個(gè)數(shù)字,是,與推理出來(lái)的效果是一模一樣的
99!=933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000
算出結(jié)果0的個(gè)數(shù)22
二進(jìn)制個(gè)數(shù)95個(gè)