面試中你不可迴避的C、C++的問題(四)

            在IT企業面試中往往會讓你手寫一段代碼,然後討論,其實一般的代碼都不是很難,但是技巧性較強,所以很多同學心中有點犯怵,其實大可不必,在準備面試前自己多寫寫基本思維的代碼,對面試還是有好處的。自己也要找工作,所以將一些比較重要的問題,拿出來更大家一起曬曬,共同進步!

問題一:基本的階乘-遞歸問題

基本模式:

#include <stdio.h>

int Factorial(int n)
{
    if(1==n)
        return 1;
    else
        return Factorial(n-1)*n;
    return 0;
}

int main()
{
    int num = Factorial(10);
    printf("%d\n",num);
    return 0;
}
但是往往,階乘都比較大,所以建議使用這樣的方式,這樣面試官會知道你是基本還是瞭解一點程序可能出現的錯誤,所以不妨將int換成long,這樣表示的範圍比較大,但是對於大的階乘貌似就不太好了!

#include <stdio.h>

long Factorial(long n)
{
    if(1==n)
        return 1;
    else
        return Factorial(n-1)*n;
    return 0;
}

int main()
{
    long num = Factorial(10);
    printf("%ld\n",num);
    return 0;
}
其實同學們也可以使用非遞歸的形式解決這個問題,但是也會有同樣的問題,就是會很容易的超出int表示的範圍

long Factorial_NR(long n)
{
    long sum = 1;
    while(n>0)
        sum *= n--;
    return sum;
}
其實,這些算法就是最基本的算法,在後續的文章中,我會寫一寫關於大數的一些基本操作,那個纔是在實際工程中需要的真正算法!

問題二:多重循環簡化問題

         編程實現,一個射擊運動員連開十槍最後恰好打中九十環的可能性?

解答:

        其實,這個問題可以使用多重循環解決問題, 但是如果你這樣給面試官寫出這個問題的時候,估計你也離這個公司漸行漸遠了。我們要好好分析,情況成立的可能條件,和不可能條件,使用剪枝算法可以將一些無用的運算直接刪除。

        每一槍可以打0-10換,共11種可能:

        1.當你的現在得分在很少,即使後面每一環都打10環也不可能得到90環,所以這種情況下就直接退出;

        2.如果滿足條件且打到最後一次;

        3.讓每次都嘗試的打中每種可能,這樣就可以遍歷所有的可能;

看源代碼如下:

#include <iostream>

using namespace std;

int sum=0,store[10];

void OutPut()
{
    for(int i=9;i>=0;i--)
        cout << store[i] << " ";
    cout << endl;
    sum++;
}

void Comput(int score,int num)
{
    if(score < 0 || score > (num+1)*10)
        return ;
    if(0==num)
    {
        store[num] = score;
        //OutPut();
        sum++;
        return ;
    }

    for(int i=0;i<11;i++)
    {
        store[num]=i;
        Comput(score-i,num-1);
    }
}

int main()
{
    Comput(90,9);
    cout << "Total Number is: " << sum << endl;
    return 0;
}
       將輸出信息全部屏蔽掉,這樣可以讓執行速度提高很多!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章