1.
题意要求计算n!的value值后面有0的个数,实际上可以理解为n!的计算中有多少个5的倍数被乘入。
int CountZero(int n) { int cnt = 0; for (int i = 1;i <= n;i++) { int tmp = i; while (0 == i%5) { cnt++; tmp /= 5; } } return cnt; }
2.
题意求N!中二进制表示最低位1的位置,可以发现奇数的乘入对1的位置没有影响。一旦乘以2,整个数值为左移1位,故最后结果和分解因数后2的个数有关
int CountBinaryOne(int n) { int cnt = 0; for (int i = 1;i <= n;i++) { int tmp = i; while(0 == tmp%2) { cnt++; tmp/=2; } } return cnt; }