C++ 基础概念收藏(二)
时间:2010-06-23 来源:静止的流水
链表和数组的差别
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.写一个病毒 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhongjiekangping/archive/2009/09/17/4564238.aspx
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.写一个病毒 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhongjiekangping/archive/2009/09/17/4564238.aspx
相关阅读 更多 +