标签:阿里笔试题
投递了阿里的C/C++方向研发,昨天晚上参加在线笔试时完全懵了,各种数学题、智力题,以及各种看似风马牛不相及的题目在一起,各位感受下.
题目中涉及到排列组合 基本数学问题等.下面关于以上部分题目给出自己的意见,如果有不对的地方,希望各位指正.
关于数N!有多少个零
思路:给定一个整数N,那么N的阶乘N!末尾有多少个0的问题可以转换为N!乘式中可以分解出多少个5的问题.因为5和其前面的任何一个偶数相乘都会产生0,所以只需求出在由1到N的数中共可以分解出多少个5.例如25!,可以分解出5(1×5)、10(2×5),15(3×5),20(4×5)25(5×5),共可以分解出6个5,所以25!末尾有6个0;
由此可以推知15!最后有3个0…
当然特殊的情况需要注意,比如数字是100,1000这样的情况,还有50,500这样的情况,楼主稍加思考不难得出正确的结论。
例如10!=10×9×8×7×6×5×4×3×2×1=2×5×9×8×7×6×5×4×3×2×1(含2个5,所以结果末尾有两个0)
/* Name: n!.cpp Copyright: 52coder.net Author: HeHe.wang Date: 03-04-15 10:58 Description: 程序用户确定N!(n的阶乘结果有多少个0) */ #include<stdio.h> int ZeroNum(int n) { int j,num=0; for(int i=n;i>1;i--) { j=i; while(j%5==0) { num++; j/=5; } } return num; } int main() { int n=100; printf("%d",ZeroNum(n)); }
实际上使用排列组合更简单9×9×9×9×9×9=531441
#include <stdio.h> int count(int n) { while(n!=0) { if(n%10==1) return 1; n/=10; } return 0; } int main() { int icount=0; int n; scanf("%d",&n); for(int i=0;i<=n;i++) { icount+=count(i); } printf("%d\n", n+1-icount); }其余的几道题排列组合相对比较简单,真正考c/c++的题不多,我居然没想到把代码复制到编译器里运行一遍,而是自己运算,我还是太单纯了呀.
标签:阿里笔试题
原文地址:http://blog.csdn.net/persever/article/details/45815669