科大訊飛筆試收獲
(1)數組a[N],存放了1 至N-1 個數,其中某個數重復一次。寫一個函數,找出被重復的數字.時間復雜度必須為o(N)函數原型:int do_dup(int a[],int N)
編寫程序如下:
int do_dup(int a[],int N)//a[0]與a[temp]交換後比較,如果相等就返回這個相同的值,如果不相等就繼續比較下去。
{
int temp;
while(a[0]!=a[a[0]])
{
temp=a[0];
a[0]= a[temp];
a[temp]=temp;
}
return a[0];
}
主函數如下:
#define N 10
int main()
{
int a[N]={1,2,3,4,5,8,}
cout<<do_dup(a,N);
}
(2)在b1、b2 ……bn中找出最大的值,采用遞歸的方法,具體代碼如下:
int sort(int a[],int n)
{
int max;
for(int i=0;i<n;i++)
{
if(n==0)
return a[0];
else
{
max=sort(a,n-1);
if(a[n-1]>=max)
max=a[n-1];
}
return max;
}
}
(3)
c語言版
#include<iostream>
- using namespace std;
- int f(int x, int y)
- {
- if (x == 0 ||y==0)
- return 1;
- else
- return f(x - 1, y) + f(x, y - 1);
- }
- int main()
- {
- int x, y;
- cin >> x >> y;
- cout << f(x, y);
- }
編譯系統和解釋系統的區別
計算機並不能直接地接受和執行用高級語言編寫的源程序,源程序在輸入計算機時,通過"翻譯程序"翻譯成機器語言形式的目標程序,計算機才能識別和執行。這種"翻譯"通常有兩種方式,即編譯方式和解釋方式。
編譯方式是指利用事先編好的一個稱為編譯程序的機器語言程序,作為系統軟件存放在計算機內,當用戶將高級語言編寫的源程序輸入計算機後,編譯程序便把源程序整個地翻譯成用機器語言表示的與之等價的目標程序,然後計算機再執行該目標程序,以完成源程序要處理的運算並取得結果。
解釋方式是指源程序進入計算機後,解釋程序邊掃描邊解釋,逐句輸入逐句翻譯,計算機一句句執行,並不產生目標程序。如PASCAL、FORTRAN、COBOL等高級語言執行編譯方式;BASIC語言則以執行解釋方式為主;而PASCAL、C語言是能書寫編譯程序的高級程序設計語言。
編譯程序、解釋程序、匯編程序是3種語言處理程序。其區別主要為:
匯編程序(為低級服務)是將匯編語言書寫的源程序翻譯成由機器指令和其他信息組成的目標程序。
解釋程序(為高級服務)直接執行源程序或源程序的內部形式,一般是讀一句源程序,翻譯一句,執行一句,不產生目標代碼,如BASIC解釋程序。
編譯程序(為高級服務)是將高級語言書寫的源程序翻譯成與之等價的低級語言的目標程序。
編譯程序與解釋程序最大的區別之一在於前者生成目標代碼,而後者不生成;此外,前者產生的目標代碼的執行速度比解釋程序的執行速度要快;後者人機交互好,適於初學者使用。用COBOL、FORTRAN等語言編寫的程序考慮到執行速度一般都是編譯執行。 解釋:程序運行時,取一條指令,將其換化為機器指令, 再執行這條機器指令。 編譯:程序運行時之前,將程序的把有代碼編譯為機器代碼,再運行這個程序。
PS:騰訊一道筆試題:
下面關於解釋系統和編譯系統的說法中,錯誤的是()
A.解釋程序不產生目標代碼,直接執行源程序或源程序的內部形式
B.使用編譯系統時會區分編譯階段和運行階段
C.一般來說,解釋系統比編譯系統復雜,但是可移植性好
D.一般來說,建立在編譯基礎上的系統執行速度要比建立在解釋基礎上的系統快
答案是選A, 錯在後半部分,並不是直接執行源程序,而是必須要轉換為機器可識別碼才能運行
C++代碼每一次進行更新都需要重新編譯,有些大型系統編譯一次需要花很長時間,這就對系統的調試帶來很多不便,如linux內核,這個是編譯系統的一個不足。
下面是對編譯型語言和解釋型語言介紹:
編譯型語言:
編譯是指在應用源程序執行之前,就將程序源代碼“翻譯”成目標代碼(機器語言),因此其目標程序可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標文件(* .OBJ)才能執行,只有目標文件而沒有源代碼,修改很不方便。現在大多數的編程語言都是編譯型的。編譯程序將源程序翻譯成目標程序後保存在另一個文件中,該目標程序可脫離編譯程序直接在計算機上多次運行。大多數軟件產品都是以目標程序形式發行給用戶的,不僅便於直接運行,同時又使他人難於盜用其中的技術C、C++、Fortran、Visual Foxpro、Pascal、Delphi、Ada都是編譯實現的。
解釋型語言:
解釋型語言的實現中,翻譯器並不產生目標機器代碼,而是產生易於執行的中間代碼,這種中間代碼與機器代碼是不同的,中間代碼的解釋是由軟件支持的,不能直接使用硬件,軟件解釋器通常會導致執行效率較低。用解釋型語言編寫的程序是由另一個可以理解中間代碼的解釋程序執行的。與編譯程序不同的是,解釋程序的任務是逐一將源程序的語句解釋成可執行的機器指令,不需要將源程序翻譯成目標代碼後再執行。解釋程序的優點是當語句出現語法錯誤時,可以立即引起程序員註意,而程序員在程序開發期間就能進行校正。對於解釋型Basic語言,需要一個專門的解釋器解釋執行 Basic程序,每條語言只有在執行才被翻譯。這種解釋型語言每執行一次就翻譯一次,因而效率低下。一般地,動態語言都是解釋型的,如Tcl、Perl、Ruby、VBScript、 JavaScript等。
混合型:
Java很特殊,Java程序也需要編譯,但是沒有直接編譯稱為機器語言,而是編譯稱為字節碼,然後在Java虛擬機上用解釋方式執行字節碼。Python 的也采用了類似Java的編譯模式,先將Python程序編譯成Python字節碼,然後由一個專門的Python字節碼解釋器負責解釋執行字節碼。(Java虛擬機對字節碼的執行相當於模擬一個cpu,而ruby1.8--在虛擬機還未出現前--是通過解釋成語法樹執行。)
個人認為,java是解釋型的語言,因為雖然java也需要編譯,編譯成.class文件,但是並不是機器可以識別的語言,而是字節碼,最終還是需要jvm的解釋,才能在各個平臺執行,這同時也是java跨平臺的原因。所以可是說java即是編譯型的,也是解釋型,但是如果非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。
轉發地址:http://blog.csdn.net/mark555/article/details/23206377科大訊飛筆試收獲