C++ 基础概念(二)
?鏈表和數組的差別
A 從邏輯結構來看
A-1. 數組必須事先定義固定的長度(元素個數),不能適應數據動態地增減的情況。當???? 數據增加時,可能超出原先定義的元素個數;當數據減少時,造成內存浪費。
A-2. 鏈表動態地進行存儲分配,能適應數據動態地增減的情況,且能方便地插入、???? 刪除數據項。(數組中插入、刪除數據項時,需要移動其他數據項)
B 從內存存儲來看
B-1. (靜態)數組從棧中分配空間, 對于程式員方便快速,不過自由度小
B-2. 鏈表從堆中分配空間, 自由度大不過申請管理比較麻煩.
?
堆和棧的差別
solost 于 2004年 10月09日 發表
一、預備知識?
程式的內存分配
一個由c/C++編譯的程式占用的內存分為以下幾個部分
1、棧區(stack)??? 由編譯器(Compiler)自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2、堆區(heap) ??? 一般由程式員分配釋放, 若程式員不釋放,程式結束時可能由OS回收 。注意他和數據結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
3、全局區(靜態區)(static)?,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 - 程式結束后有系統釋放
4、文字常量區? ? 常量字符串就是放在這里的。 程式結束后由系統釋放
5、程式代碼區? 存放函數體的二進制代碼。
?
二、例子程式
這是個前輩寫的,非常周詳
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將他和p3所指向的"123456"優化成一個地方。
}
二、堆和棧的理論知識
2.1申請方式
stack:
由系統自動分配。 例如,聲明在函數中一個局部變量 int b; 系統自動在棧中為b開辟空間
heap:
需要程式員自己申請,并指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = (char *)malloc(10);
不過注意p1、p2本身是在棧中的。
2.2 申請后系統的響應
棧:只要棧的剩余空間大于所申請空間,系統將為程式提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程式的申請時,
會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程式,另外,對于大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由于找到的堆結點的大小不一定正好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中。
2.3申請大小的限制
棧:在視窗系統下, 棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
2.4申請效率的比較:
棧由系統自動分配,速度較快。但程式員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最佳的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。不過速度快,也最靈活。
2.5堆和棧中的存儲內容
棧: 在函數調用時,(1) 第一個進棧的是主函數中后的下一條指令(函數調用語句的下一條可執行語句)的地址,(2) 然后是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,(3) 然后是函數中的局部變量。 注意: 靜態變量是不入棧的。
當本次函數調用結束后,(1) 局部變量先出棧,(2) 然后是參數,(3) 最后棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程式由該點繼續運行。
堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程式員安排。
2.6存取效率的比較
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
不過,在以后的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
對應的匯編代碼
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一種在讀取時直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據edx讀取字符,顯然慢了。
2.7小結:
堆和棧的差別能用如下的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,不過自由度小。
使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,不過比較符合自己的口味,而且自由度大。
?
深度優先搜索和廣度優先搜索算法有何差別呢?
通常深度優先搜索法不全部保留結點,擴展完的結點從數據庫中彈出刪去,這樣,一般在數據庫中存儲的結點數就是深度值,因此他占用空間較少。所以,當搜索樹的結點較多,用其他方法易產生內存溢出時,深度優先搜索不失為一種有效的求解方法。
廣度優先搜索算法,一般需存儲產生的所有結點,占用的存儲空間要比深度優先搜索大得多,因此,程式設計中,必須考慮溢出和節省內存空間的問題。但廣度優先搜索法一般無回溯操作,即入棧和出棧的操作,所以運行速度比深度優先搜索要快些
?
void main(void)
{
? int nArrLength(400), i = 546;???????? // 主要是考看對C++的基礎知識是否了解
? // 這里的int nArrLength(400)是對整數的定義,當然,明名上有問題,這里是故意這樣的
? // 但是,最好是變量名改為 ....[還是您自己看著辦了]
? for (int i = 0; i< 99999999999; i++); // 這里是考對變量越界理解,同時....,
? // 所以,999...應該改為 ~((int)0),也就是整數中0取反
? // 考對變量塊作用域的理解,這里的i,在循環后就不存在了
? cout << nArrLength << endl;?????????? // 這里輸出 400
? cout << i << endl;??????????????????? // 這里輸出 546??
}
以上代碼如果有錯,請該正,并寫出輸出結果?
?
int i = 5, b = 7;
cout << (i+++b) <<endl;
不用調試,請說出,以上代碼
在VC中和BCB中的輸出結果??
VC? :12
BCB :13
?
--------------------------------------------------------------------------------
?
寫一個能做左值的函數(方法有很多)
? 如:max(x, y) += 2874 + 55;
????? drwline(x, y)++;
? 答案:
? int &max(int & x, int & y)
? {
???? return x > y? x : y;
? }
? int x = 55, y = 77;
? max(x, y) += 12 + 11; // 此時 y = 92;
? cout << "x = "x << "; y = "<< y << endl; // 輸出 x = 55; y = 92;
?
int strcmp(char *s,char *t)
{
while(*s && *t && _______ ) // *s == *t
{
s++;
t++;
}
?
return (______)???????????? // *s - *t
}
?
.實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,寫出這兩個函數。
2.寫一個函數,將其中的/t都轉換成4個空格。
3.Windows程序的入口是哪里?寫出Windows消息機制的流程。
4.如何定義和實現一個類的成員函數為回調函數?
5.C++里面是不是所有的動作都是main()引起的?如果不是,請舉例。
6.C++里面如何聲明const void f(void)函數為C程序中的庫函數?
7.下列哪兩個是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
8.內聯函數在編譯時是否做參數類型檢查?
void g(base & b){
b.play;
}
void main(){
son s;
g(s);
return;
}?
1,程序設計(可以用自然語言來描述,不編程):C/C++源代碼中,檢查花括弧(是"("與
")","{"與"}")是否匹配,若不匹配,則輸出不匹配花括弧所在的行與列。
2,巧排數字,將1,2,...,19,20這20個數字排成一排,使得相鄰的兩個數字之和為一個素數,且
首尾兩數字之和也為一個素數。編程打印出所有的排法。
3,打印一個N*N的方陣,N為每邊字符的個數( 3〈N〈20 ),要求最外層為"X",第二層為"Y",從第三層起每層依次打印數字0,1,2,3,...
例子:當N =5,打印出下面的圖形:
?X X X X X
?X Y Y Y X
?X Y 0 Y X
?X Y Y Y X
?X X X X X
?
1.請你分別畫出OSI的七層網絡結構圖和TCP/IP的五層結構圖。
2.請你詳細地解釋一下IP協議的定義,在哪個層上面?主要有什么作用?TCP與UDP呢?
3.請問交換機和路由器各自的實現原理是什么?分別在哪個層次上面實現的?
4.請問C++的類和C里面的struct有什么區別?
5.請講一講析構函數和虛函數的用法和作用。
6.全局變量和局部變量有什么區別?是怎么實現的?操作系統和編譯器是怎么知道的?
7.8086是多少位的系統?在數據總線上是怎么實現的?
聯想筆試題
1.設計函數 int atoi(char *s)。
2.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 輸出是多少?
3.解釋局部變量、全局變量和靜態變量的含義。
4.解釋堆和棧的區別。
5.論述含參數的宏與函數的優缺點。
c++最后幾個大題目是
1,實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,這兩個函數。
2,寫一個函數將其中的/t都轉換成4個空格。
3,windows程序的入口是哪里?寫出windows消息機制的流程。
4,如何定義和實現一個類的成員函數為回調函數。
還有前面的幾個:
1. class A{
int a;
int b;
}
問的是編譯時的default constructor function的問題。
還有一個說,A有其他自己定義的構造函數,問是否還有default constructor function
還是什么來著,記不清樂。
2. c++里面是不是所有的動作都是main()引起的?如果不是,請舉例。
3. c++里面如何聲明const void f(void)函數為C庫函數?(這個我前幾天還看來著,
居然就忘記樂, )
對了,還考樂一些關于const的問題
問下列哪兩個是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
還有一個是考類的成員函數是 void f() const;型的時候調用的問題。
幸好昨天剛剛看樂這部分的內容,呵呵
內聯函數考了一題,問內聯函數在編譯時是否做參數類型檢查。
虛函數也考了一題,不過不難。
class base{
public:
virtual void play(){
cout<<"base";
}
}
class son: public base{
public:
void play(){cout<<"son";}
}
void g(base & b){
b.play;
}
void main(){
son s;
g(s);
return;
}
我所收集的intel比試題&面試題:
(熟悉大公司的題目,并不僅僅是為了進這些公司,而是很多國內公司考察內容都很接近而已.)
2005筆試 :
1。高效的內存管理
2。8皇后問題
面試q:
(2) 編譯中的問題:全局變量如int i=5; int*(pf)()=foo; 分別在何時被初始化?設計時候如何具體的實現。
(3) OS相關的問題,內存訪問,cache等(包括cache在整個系統中的位置,畫出來,并解釋)
(4) 解釋例如mov ax,100H 這樣一條指令的cpu, os, memory等都完成了什么樣的工作。
(5) Strlen()的C語言實現,不能使用任何變量。
(6) 編譯中display表的一些問題
(7) 一個hash函數,輸入隨機,現發生沖突,如數據集中在某幾條中,問怎樣處理hash函數保證高效的訪問,怎樣實現?
(8) 把Switch()case…語句翻譯成三元組。
(9) 一個byte(用C語言實現計數其中1的個數),給出最高效的實現方法。(位域)或者查表最快的;
(10) 上海有多少個加油站?你是怎樣解決這一問題?
(11) C語言參數的入棧順序?為什么這么實現?
(12) 你的最大的優點和缺點分別是什么?
(13) C語言中字符串的翻轉,最高效率(時間和空間)的實現?
2004
1. 三個float:a,b,c 問值
(a+b)+c==(b+a)+c
(a+b)+c==(a+c)+b
2. 把一個鏈表反向填空
3. 設計一個重采樣系統,說明如何anti-alias
4. y1(n)=x(2n), y2(n)=x(n/2),問:
如果y1為周期函數,那么x是否為周期函數
如果x為周期函數,那么y1是否為周期函數
如果y2為周期函數,那么x是否為周期函數
如果x為周期函數,那么y2是否為周期函數
5. 如果模擬信號的帶寬為5KHZ,要用8K的采樣率,怎么辦。
4. 某個程序在一個嵌入式系統(200M的CPU,50M的SDRAM)中已經最化了,換到另一個系統
(300M的CPU,50M的SDRAM)中運行,還需要優化嗎?
5. x^4+a*x^3+x^2+c*x+d最少需要作幾次乘法
6. 什么情況下,sin(x+y)+y ~ ....
7. 下面哪種排序法對12354最快
a quick sort
b.buble sort
c.merge sort
8. 哪種結構,平均來講,獲取一個值最快
a. binary tree
b. hash table
c. stack
1。 pipeline
2。 程序流程圖題目
3。 哲學家進餐
4。 32bit,64bit,兩個平臺上complier,linker,os kernel,library,debuger的性質
5。 const char * vs char const * (?)
6。 GDT and LDT
7。 1+1<<1
8。 Stack性質
9。 ???
10。正方體中壓力什么的。。。
大題
1。f[40,400],log10變換
2。ACPI
3。讀程序
4。頻譜,采樣分析
大題
1。寫出下列信號的奈虧斯特頻率
(1)f(t)=1+cos(2000pait)+sin(4000pait)
(2)f(t)=sin(4000pait)/pait
(3)f(t)=(sin(4000pait)的平方)/pait
2.填程序
把一個計算m^n的程序填充完整
大概的意思是:
有一個全局數組char s[BUFSIZE]
利用這個數組計算,就是每個單元存放計算結果的一位,index小的存放低位,index大
的存放高位
3。有兩個線程
void producer()
{
while(1)
{
GeneratePacket();
PutPacketIntoBuffer();
Signal(customer);
}
}
void customer()
{
while(1)
{
WaitForSignal();
if(PacketInBuffer>10)
{
ReadAllPackets();
ProcessPackets();
}
}
}
(1)有沒有其他方法可以提高程序的性能
(2)可不可以不使用信號之類的機制來實現上述的功能
4。優化下面的程序
(0)sum=0
(1)I=1
(2)T1=4*I
(3)T2=address(A)-4
(4)T3=T2[T1]
(5)T4=address(B)-4
(6)T5=4*I
(7)T6=T4[T5]
(8)T7=T3*T5
(9)sum=sum+T6
(10)I=I+1
(10)IF I<20 GOTO (2)
1。關于c的main函數
2。15個人循環報數,報到N的出列,找出最后留下的那個人,算法填空題
2。找出一個給出的并行解決方案的錯誤情況
3。關于GPIO,intel的四種體系結構
選擇題10題
有關vc和c,指針,HyporThreading Dual-core等等
看也看不懂的
2003年的
1:概率題。x,y為隨機變量,聯合概率密度 f(x,y) = intig(0,1)*dx*intig(0,x)*k*d
y,k為常數,求k=? E(xy)=?
注:intig(a,b)為a到b的定積分。
2:概率題。A,B為隨機事件,以下哪個正確
A. P(A U B)*p(AB) <= P(A)P(B)
B. P(A U B)*p(AB) >= P(A)P(B)
C. P(A U B)*p(AB) <= P(A) + P(B)
D. P(A U B)*p(AB) >= P(A) + P(B)
3: 信道帶寬200kHz,信噪比10dB,求信道波特率=?
4:以下代碼運行結果是什么
int main()
{
int a,b,c,abc = 0;
a=b=c=40;
if(c)
{
int abc;
abc = a*b+c;
}
printf("%d,%d", abc, c);
return 0;
}
5:給出了從紐約出發和到達落山雞的各種航班信息,寫出找到一條從紐約到落山雞的最
短距離的航班組合的代碼。
6:從計算機圖形上截取某個物體邊緣的若干個坐標,求這個物體面積,并跟判斷是方形
還是圓形,為啥。(坐標不記得,大概是個圓
)。
7:離散卷機與DFT的區別與關系。快速求不滿足2^N長度的離散傅立葉變換的方法有哪些
?如何用fft求N*M點的離散卷機?
8:給出fir和iir的優缺點。
9:如何計算線性標量量化器的量化噪聲?需要那些假設?
1、請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句
2、如何輸出源文件的標題和目前執行行的行數
3、兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法
4、寫一個病毒
5、有A、B、C、D四個人,要在夜里過一座橋。他們通過這座橋分別需要耗時1、2、5、10分鐘,只有一支手電,并且同時最多只能兩個人一起過橋。請問,如何安排,能夠在17分鐘內這四個人都過橋?
2005年騰訊招聘
選擇題(60)
? c/c++ os linux 方面的基礎知識 c的Sizeof函數有好幾個!
程序填空(40)
1.(20) 4空x5
? 不使用額外空間,將 A,B兩鏈表的元素交叉歸并
2.(20) 4空x5
MFC? 將樹序列化 轉存在數組或 鏈表中!
?
1.請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句
// 這樣轉向定義應該不算違規吧!^_^
#include "stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
?
#define Cmp(x,y) compare(x,y)
?
int compare( int a, int b)
{
???? a^=(1<<31); b^=(1<<31);
???? int i=31;
??? while ((i^-1) && !((a&(1<<i))^(b&(1<<i))))???? i--;
???? return (i^-1)?(((a>>i)&1)?1:-1):0;
}
?
int _tmain()
{
???? int c;
???? c = Cmp(5,4);
???? cout<<c<<endl;
???? return 0;
}
jruv?? (~~~一葉落而知天下秋~~~) 的答案:
#define?? COMPARE(a,b)?? ((a)-(b))???????? //<0:?? a<b?? =0:a==b>0:a>b??
2.如何輸出源文件的標題和目前執行行的行數
cout?? <<?? "Filename?? "?? <<?? __FILE__?? <<?? "?? Line?? "?? <<?? __LINE__?? <<?? endl;
3.兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法
? 算法提示:
????????? 輸入 string a, string b; 計算string c=a*b; 返回 c;
1,??? 紀錄小數點在a,b中的位置l1,l2, 則需要小數點后移動位置數為l=length(a)+length(b)-l1-l2-2;
2,??? 去掉a,b中的小數點,(a,b小數點后移,使a,b變為整數)
3,??? 計算c=a*b; (同整數的大數相乘算法)
4,??? 輸出c,(注意在輸出倒數第l個數時,輸出一個小數點。若是輸出的數少于l個,就補0)
du51(郁郁思揚)的答案:
變為整數求就行了.輸入的時候記一下,小數點位置..輸出再做點文章就行了.
下面的是大整數的運算.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
?? int data;
?? Node *next;
};
void output(Node *head)
{
?? if(!head->next&&!head->data)return;
?? output(head->next);
?? cout<<head->data;
}
void Mul(char *a,char *b,int pos)????????
{
?? char *ap=a,*bp=b;
?? Node *head=0;
?? head=new Node;head->data=0,head->next=0;?? //頭
?? Node *p,*q=head,*p1;
?? int temp=0,temp1,bbit;
?? while(*bp)??????????????? //若乘數不為空 ,繼續.
?? {
?????? p=q->next;p1=q;
?????? bbit=*bp-48;????????? //把當前位轉為整型
?????? while(*ap||temp)??????????? //若被乘數不空,繼續
?????? {
?????????? if(!p)??????????? //若要操作的結點為空,申請之
?????????? {
?????????????? p=new Node;
?????????????? p->data=0;
?????????????? p->next=0;
?????????????? p1->next=p;
?????????? }
?????????? if(*ap==0)temp1=temp;
?????????? else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
?????????? p1->data=temp1%10;??? //留當前位
?????????? temp=temp1/10;??? //進位以int的形式留下.
?????????? p1=p;p=p->next;???????????????? //被乘數到下一位
?????? }
?????? ap=a;bp++;q=q->next;??????????????? //q進下一位
?? }
?? p=head;
?? output(p);?????????????????? //顯示
?? cout<<endl;
?? while(head)???????????????? //釋放空間
?? {
?????????? p=head->next;
?????????? delete head;
?????????? head=p;
?? }
}
int main()
{
?? cout<<"請輸入兩個數"<<endl;
?? char test1[MAX],test2[MAX];
?? cin.getline(test1,MAX,'/n');
?? cin.getline(test2,MAX,'/n');
?? Mul(strrev(test1),strrev(test2));
?? system("PAUSE");
?? return 0;
}
上面大整數已經寫了.你加幾個東西就行了.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
?? int data;
?? Node *next;
};
void output(Node *head,int pos)
{
?? if(!head->next&&!head->data)return;
?? output(head->next,pos-1);
?? cout<<head->data;
?? if(!pos)cout<<".";
}
void Mul(char *a,char *b,int pos)????????
{
?? char *ap=a,*bp=b;
?? Node *head=0;
?? head=new Node;head->data=0,head->next=0;?? //頭
?? Node *p,*q=head,*p1;
?? int temp=0,temp1,bbit;
?? while(*bp)??????????????? //若乘數不為空 ,繼續.
?? {
?????? p=q->next;p1=q;
?????? bbit=*bp-48;????????? //把當前位轉為整型
?????? while(*ap||temp)??????????? //若被乘數不空,繼續
?????? {
?????????? if(!p)??????????? //若要操作的結點為空,申請之
?????????? {
?????????????? p=new Node;
?????????????? p->data=0;
?????????????? p->next=0;
?????????????? p1->next=p;
?????????? }
?????????? if(*ap==0)temp1=temp;
?????????? else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
?????????? p1->data=temp1%10;??? //留當前位
?????????? temp=temp1/10;??? //進位以int的形式留下.
?????????? p1=p;p=p->next;???????????????? //被乘數到下一位
?????? }
?????? ap=a;bp++;q=q->next;??????????????? //q進下一位
?? }
?? p=head;
?? output(p,pos);?????????????????? //顯示
?? cout<<endl;
?? while(head)???????????????? //釋放空間
?? {
?????????? p=head->next;
?????????? delete head;
?????????? head=p;
?? }
}
int main()
{
?? cout<<"請輸入兩個數"<<endl;
?? char test1[MAX],test2[MAX],*p;
?? int pos=0;
?? cin.getline(test1,MAX,'/n');
?? cin.getline(test2,MAX,'/n');
?? if(p=strchr(test1,'.'))
?? {
?????? pos+=strlen(test1)-(p-test1)-1;
?????? do
?????? {
?????????? p++;
?????????? *(p-1)=*p;
?????? }while(*p);
?? }???????
?? if(p=strchr(test2,'.'))
?? {
?????? pos+=strlen(test2)-(p-test2)-1;
?????? do
?????? {
?????????? p++;
?????????? *(p-1)=*p;
?????? }while(*p);
?? }???
?? Mul(strrev(test1),strrev(test2),pos);
?? system("PAUSE");
?? return 0;
}
4.寫一個病毒
cout<<"一個病毒"<<endl;
(開玩笑的,沒搞過,^_^)
?
5.讓你在100000000個浮點數中找出最大的10000個,要求時間復雜度優。
//本算法使用快排,O(n*lg(n))?
//最低可以找到線性算法,使用預先區域統計劃分!類試于構造Quad Trees! 寫起來代碼會長些!
?
#include <stdio.h>
#include <stdlib.h>
?
#define Max 100000000
int a[Max+10];
?
int cmp( const void *a, const void *b)
{
???? int *x = ( int *) a;
???? int *y = ( int *) b;
???? return *x-*y;
}
?
int main()
{
???? int n=0;
???? while (scanf("%d",&a[n])==1)???? n++;
???? qsort(a,n,4,cmp);
???? for ( int i=0;i<3;i++)???? printf("%d",a[ i ]);
???? return 1;
}
5 、有 A 、 B 、 C 、 D 四個人,要在夜里過一座橋。他們通過這座橋分別需要耗時 1 、 2 、 5 、 10 分鐘,只有一支手電,并且同時最多只能兩個人一起過橋。請問,如何安排,能夠在 17 分鐘內這四個人都過橋?
Solution:關鍵是時間最長的兩個人必須同時過橋
The First Time :?????? A(1) 和 B(2) 過橋, A(1) 返回 Cost : 1+2
The Second Time :??? C(5) 和 D(10) 過橋, B(2) 返回 Cost : 10+2
The Third Time???? A(1) 和 B(2) 過橋 Cost : 2
Total Time Cost :??? (1+2)+(10+2)+2=17 minutes
1.請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句??
? 2.如何輸出源文件的標題和目前執行行的行數??
? 3.兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法??
? 4.寫一個病毒
總結
以上是生活随笔為你收集整理的C++ 基础概念(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在Tomcat中发布网站
- 下一篇: C++著名库的比较和学习经验