投递了阿里的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));
}
问题二:0-999999中任何一位都不包含数字1的数字个数:
看到这题第一遍我就在百度、google,不过没有任何发现,我想现在如果在百度的话应该会有发现.
一开始我写了下面的程序求0-999999中任何一位都不包含数字1的数字个数
我的思路是求出0-999999含有1的个数,然后999999减去含有1的数字
因为计算是从0-999999,所以最后计算的时候是n+1-count
实际上使用排列组合更简单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++的题不多,我居然没想到把代码复制到编译器里运行一遍,而是自己运算,我还是太单纯了呀.欢迎各位留言讨论,指出有错的地方.