1、下面代码中for循环共执行了多少次?
unsigned short i,j; for(i=0, j=2; i!=j; i+=5, j+=7) {}
unsigned short占用2个字节,当数据范围到头了(2^16-1),就又从0开始计数了,这个其实就是两辆汽车行驶在一个圆圈里的汽车追及问题。一个速度为5,一个速度为7,当速度为7的超越速度为5的时候,两个汽车就相遇了,2 + 7n - 5n = 2^16 所以共循环了32767次。
unsigned short i,j; for(i=3,j=7;i!=j;i+=3,j+=7)
这个也是一样的,7 + 7n - (3+3n) = 2^16
2、下面程序应该输出多少?
char *c[] = { "ENTER", "NEW", "POINT", "FIRST" }; char **cp[] = { c+3, c+2, c+1, c }; char ***cpp = cp; int main(void) { printf("%s", **++cpp); printf("%s", *--*++cpp+3); printf("%s", *cpp[-2]+3); printf("%s\n", cpp[-1][-1]+1); return 0; }
3、已知程序代码如下:
struct S { void func1(S &); void func2(const S&); void func3(S&) const; void func4(const S&) const; };
下面哪些能正常执行()
A、makeS().func1(makeS())
B、makeS().func2(makeS())
C、makeS().func3(makeS())
D、makeS().func4(makeS())
4、下列代码的输出为多少?
int main(void) { enum {a, b=5, c, d=4, e}; enum {h,x, y, z, v=120, w, r=99,s,t}; return 0; }
a、c、e、h、x、y、z、w、s、t的值分别是多少?
在枚举类型中声明的第一个枚举成员它的默值为零。没有显示赋值的枚举成员的值,总是前一个枚举成员的值+1。
a:0 c:6 e:5
h:0 x:1 y:2 z:3 w:121 s:100 t:101
5、高度为1的平衡二叉树节点为1个,高度为5的平衡二叉树节点最少多少个?
假设高度为n的平衡二叉树至少需要的节点数目是m,那么只需要在草稿纸上画一下,我们容易知道:
n=1时,m=1;
n=2时,m=2;
n=3时,m=4;
n=4时,m=7;
n=5时,m=12;
另外,这个题也是有规律的,F(n)=F(n-1)+F(n-2)+1。
6、
union Test
{
char a[4];
short b;
};
Test test;
test.a[0]=256;
test.a[1]=255;
test.a[2]=254;
test.a[3]=253;
printf("%d\n",test.b);
问题:在80X86架构下,输出什么值?填空题。
输出:-256
short类型占2个字节,如果右边是低地址,左边是高地址,那么存储如下:
1111 1111 0000 0000
test.a[1] test.a[0]
显然b占用上面的2个字节,最高位为1,则是一个负数,取反+1后,得到-256(1000 0001 0000 0000)
7、下面代码输出什么?
#pragma pack(4) int main(void) { unsigned char puc[4]; struct tamPIM { unsigned char ucPim1; unsigned char ucData0:1; unsigned char ucData1:2; unsigned char ucData2:3; }*pstPimData; pstPimData = (struct tamPIM*)puc; memset(puc, 0 , 4); pstPimData->ucPim1 = 1; pstPimData->ucData0 = 2; pstPimData->ucData1 = 3; pstPimData->ucData2 = 4; printf("%02x %02x %02x %02x\n",puc[0],puc[1],puc[2],puc[3]); return 0; } #pragma pack()第一个自己直接存储0x01,这个不需要解释的。关键是第二个自己的存储,首先1个bit为用来存储2,导致最低位存0 ,其次两位 11,再其次三位100,最后空两个00。
int main(void) { unsigned int un = -1; // 0~4294967295 unsigned short us = -1; // 0~65535 printf("%d %d\n",us,un); /* us的二进制表示是0xffff,以4个字节的int类型输出时表示的是0x0000ffff,所以输出65535 un的二进制表示是0xffffffff,以4个字节的int类型输出时表示的是-1,所以输出-1 */ cout<<us<<endl; // -1在无符号的short数据中是65535 cout<<un<<endl; // -1在无符号的int数据中是4294967295 //printf("%x %x\n",us,un); // 16进制的形式 //printf("%p %p\n",&us,&un); // 输出地址 return 0; }输出:65535 -1
思路是思想跟这个一样,用两个数组b、c
b[i] = a[0] *... * a[i - 1],c[i] = a[i + 1] *...*a[n] ,时间复杂度为O(2n)
最后a[i] = b[i]*c[i],我在这里没用c数组,少用c【i】数组的话,程序写起来就不是太好理解,其实是一个道理。
int main(void) { int i, a[]={1,2,3,4}; int temp, n=4; int *b = new int[n]; b[0] = a[0]; for(i = 1; i < n-1; i++) { b[i]=b[i-1]*a[i]; } b[n-1] = a[n-1]; for(i = n-1; i >= 0; i--) { temp = a[i]; if(i == n-1) a[i] = b[i-1]; if(i>0 && i<n-1) { a[i] = b[i-1]*b[i+1]; b[i] = temp*b[i+1]; } if(i == 0) a[0] = b[1]; } //输出最后的a元素 for(i = 0; i < n; i++) { printf("%d ",a[i]); } return 0; }