99的階乘分析
主要是分析一些特征,當(dāng)然這里可能先不會直接去求這個數(shù)
這個數(shù)字末尾有0嗎茵臭,如果有疫诽,數(shù)量是多少
可能99!太復(fù)雜旦委,一般先分析簡單的奇徒。比如5!缨硝,6摩钙!,7查辩!胖笛,8!
5!=54321=120 結(jié)尾是1個0
8!=87654321=40320
這里面特征就是這個數(shù)可以被5整除嗎宜岛?
比如120=54321中有1個5則結(jié)尾就是1個0长踊,8也是一樣只有1個5.
當(dāng)然如果是10也可以,比如3628800=10987654321含有1個5萍倡,
1個10身弊,則被5整除的數(shù)字有2個,3628800結(jié)尾就是有2個0
實際上125這種還要處理一下列敲,125*4=600是有2個0的阱佛,對于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;
}
這個數(shù)字的二進制末尾有0嗎戴而,如果有凑术,數(shù)量是多少
繼續(xù)分析二進制特點比如十進制11對應(yīng)的二進制也就是1011,末尾是1所意,所以末尾1個0都沒有淮逊,對于奇數(shù)特點就是末尾是1,所以奇數(shù)末尾一個0都沒有啦
分析偶數(shù)比如8扁眯,二進制是1000壮莹,末尾3個0,可以通過右移3位得出數(shù)字末尾是1了姻檀;
分析10呢命满,對應(yīng)二進制是1010,通過右移1位得出數(shù)字末尾是1了绣版;
右移1位代表除以2胶台,那么1010歼疮,看看這個數(shù)能被2除以幾次呢?如果是10诈唬,除以2就變成奇數(shù)了韩脏,也就是二進制第一位是1了,說明10的二進制末尾只有1個0铸磅;
所以10的階乘赡矢,1098765432*1,看看這個數(shù)字除以2到什么時候才會
變成奇數(shù)阅仔,除以1次說明二進制末尾1個0吹散,除以10次末尾就有10個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;
}
找到這個數(shù)字,是八酒,與推理出來的效果是一模一樣的
99!=933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000
算出結(jié)果0的個數(shù)22
二進制個數(shù)95個