天天看點

2015年阿裡研發工程師實習線上筆試題

投遞了阿裡的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++的題不多,我居然沒想到把代碼複制到編譯器裡運作一遍,而是自己運算,我還是太單純了呀.

歡迎各位留言讨論,指出有錯的地方.