IT公司笔试面试题系列(十一…

来源:互联网 发布:1password ubuntu 编辑:程序博客网 时间:2024/06/07 05:03
原文地址:IT公司笔试面试题系列(十一)作者:邹博伟

1.求1000!的未尾有几个0

(用素数相乘的方法来做,如72=2*2*2*3*3)
求出1->1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,
能被625整除的数的个数n4.
1000!末尾的零的个数=n1+n2+n3+n4;
#include<stdio.h>
#define NUM 1000

int find5(int num)

{
    intret=0;
   while(num%5==0)

   {
       num/=5;
       ret++;
    }
    returnret;
}
int main()

{
    int result=0;
    int i;
    for(i=5;i<=NUM;i+=5)
        result+=find5(i);
    printf(" the total zero number is %dn",result);
    return 0;
}

2.打印螺旋矩阵,输入N, 打印 N*N 矩阵
比如 N = 3,打印:

1 2 3
8 9 4
7 6 5

N = 4,打印:

4
12 13 14 5
11 16 15 6
10 7
解:
1 #define N 15
int s[N][N];
void main()
{
int k = 0, i = 0, j = 0;
int a = 1;
for( ; k < (N+1)/2; k++ )
{
while( j < N-k ) s[i][j++] = a++; i++; j--;
while( i < N-k ) s[i++][j] = a++; i--; j--;
while( j > k-1 ) s[i][j--] = a++; i--; j++;
while( i > k ) s[i--][j] = a++; i++; j++;
}
for( i = 0; i < N; i++ )
{
for( j = 0; j < N; j++ )
cout << s[i][j]<< 't';
cout << endl;
}
}
2 define MAX_N 100
int matrix[MAX_N][MAX_N];


void SetMatrix(int x, int y, int start, int n) {
int i, j;

if (n <= 0) //递归结束条件
return;
if (n == 1) { //矩阵大小为1时
matrix[x][y] = start;
return;
}
for (i = x; i < x + n-1; i++) //矩阵上部
matrix[y][i] = start++;

for (j = y; j < y + n-1;j++) //右部
matrix[j][x+n-1] = start++;

for (i = x+n-1; i > x; i--)//底部
matrix[y+n-1][i] = start++;

for (j = y+n-1; j > y; j--)//左部
matrix[j][x] = start++;

SetMatrix(x+1, y+1, start, n-2);//递归
}

void main() {
int i, j;
int n;

scanf("%d", &n);
SetMatrix(0, 0, 1, n);

//打印螺旋矩阵
for(i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%4d", matrix[i][j]);
printf("n");
}
}

3.以下为Windows NT下的32位C++程序,请计算sizeof的值
void Func ( char str[100] )
{
 sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
解答:
sizeof( str ) = 4
sizeof ( p ) = 4

剖析:
Func ( char str[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
数组名的本质如下:
(1)数组名指代一种数据结构,这种数据结构就是数组;
  例如:char str[10];
         cout << sizeof(str)<< endl;
输出结果为10,str指代数据结构char[10]。
(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
char str[10]; 
str++; //编译出错,提示str不是左值 
(3)数组名作为函数形参时,沦为普通指针。
  Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p )都为4。

4.写一个标准MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?least = MIN(*p++, b);

解答:

#define MIN(A,B) ((A) <= (B) ? (A): (B))

MIN(*p++, b)会产生宏的副作用
 

 剖析:
  这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的参数也不是真的参数,在宏展开的时候对参数进行的是一对一的替换。
程序员对宏定义的使用要非常小心,特别要注意两个问题:
1)谨慎地将宏定义中的参数和整个宏用用括弧括起来。所以,严格地讲,下述解答:

#define MIN(A,B) (A) <= (B) ? (A) :(B)
#define MIN(A,B) (A <= B ? A : B )

都应判0分;
2)防止宏的副作用。
宏定义#defineMIN(A,B) ((A) <= (B) ? (A) : (B))MIN(*p++, b)的作用结果是:
((*p++) <= (b) ? (*p++) :(*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
除此之外,另一个应该判0分的解答是:

#define MIN(A,B) ((A) <= (B) ? (A): (B));

这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。

5.为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus

extern "C" {
#endif

#ifdef __cplusplus
}

#endif
#endif

解答:头文件中的编译宏
#ifndef __INCvxWorksh
#define __INCvxWorksh
#endif的作用是防止被重复引用。

  作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y);
该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。
   为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern"C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。

0 0
原创粉丝点击