金山软件面试题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、请你就C/C++或者JA V A代码行数、注释行数统计工具的实现,描述一下:

1、需要考虑哪些过滤条件?你如何处理?

答:过滤条件:(取得每行并去掉两头的空格后)

⑴空行,行的长度为0;⑵如果是以//开头,为注释行;⑶//在行中,并判断不是在字符串中,即―‖中,为代码+注释混合行,//在―‖中时为代码行;⑷如果/*在行中,判断是否是在―‖内,否则为注释行,*/不在―‖中时是结束;⑸/* */只在一行,判断行中是否有代码,无代码为注释行,有代码是混合行;⑹/* */多行,并且/*前无代码,/*后无代码,去掉其中空行都是注释行;⑺/* */多行,/*在代码后,或*/后有代码,有混合行;⑻一行中有2个/*并且就1个*/,此行为混合行,其后是注释行。

2、怎样提升这个工具的易用性?

答:把这个工具设置成图形界面,用户只需输入文件名或者在文件对话框中选择文件即可点击运行输出结果。

本题只需要提供思路文档,不需要程序代码。

二、给定一个自然数n,试完成如下程序,它输出不大于n的所有素数(质数)。

1、请提供程序代码,以及思路文档。

答:思路:求出一个数j的平方根sqrt(j),将j除以2~sqrt(j)之间的数,只要除尽一次,就不是素数,之后数j加2。

#include

#include

void main()

{ int N=1000;

int i,j,k,m=0;

for(j=1;j

{ k=(int)sqrt(j); /*求平方根*/

for(i=2;i<=k;i++)

{ if(j%i==0) /*只要除尽一次,就不是素数*/

break;

}

if(i>k) /*/除到k一直没除尽,是素数*/

printf(―%d ―,j);

}

}

3、请分析一下可以从哪些角度可优化该程序的时间性能?

答:偶数(除了2)不能为素数;判断一个数j是否为素数,只要将其除以2 ~ sqrt(j)之间的素数,更进一步,没有必要对所有奇数进行试除,只需对所有sqrt(j)以内的所有质数试除就可以了。

三、高精度乘法

用户输入两个不大于256 位的正整数,由程序进行乘法运算,并显示运算过程与结果。例:输入:12, 32

输出:

12

×32

————————

24

36

————————

384

#include

#include

#include

#define max 256

int A[max],B[max];

int Alen,Blen;

int S[max *2];

void InputAB() //输入A B

{ int c;

while (!isdigit(c = getchar())) ;

Alen=1;

A[0]= c –‘0′;

while (isdigit(c = getchar()))

A[Alen++] = c –‘0′;

while (!isdigit(c = getchar())) ;

Blen = 1;

B[0] = c –‘0′;

while (isdigit(c = getchar()))

B[Blen++] = c –‘0′;

}

void Print(int Array[], int len) //输出数组

{ int i=0;

while ((i

i++;

if (i == len)

{ printf(―0 \n‖);

return;

}

for ( ;i < len; i++)

printf(―%d‖,Array[i]);

printf(―\n‖);

}

void Mul(int Array[], int len, int n, int Result[], int zeros) //相乘{ int i;

for (i = len – 1; i >= 0; i–)

Result[i+1] = Array[i]*n;

Result[0] = 0;

for (i = len; i > 0; i–)

{ if (Result[i] >= 10) //大于10的进位

{ Result[i-1] +=Result[i] / 10;

Result[i] %= 10;

}

}

for (i = 1; i <= zeros; i++)

Result[len+i] = 0;

}

void Add(int total[], int tlen, const int add[], int alen) //各行相加

{ int i,k = tlen;

while ((tlen > 0) && (alen > 0)) //相加

{ tlen–;

alen–;

total[tlen] += add[alen];

}

for (i = k – 1; i>=0; i–)

if (total[i] >= 10) //大于10的进位

{ total[i - 1] += total[i] / 10;

total[i] %= 10;

}

}

void main()

{ int i,j;

int temp[max*2];

InputAB();

Print(A,Alen);

printf(―*‖);

Print(B,Blen);

printf(―—–\n‖);

for(i = Blen-1; i >= 0; i–)

{ for(j=Blen-i,j>=0;j–) //输出空格

{ printf(― ‖);

}

Mul(A, Alen, B[i], temp, Blen – 1 -i);//B中的一个数与A的所有数相乘

Print(temp, Alen + 1); //输出相乘过程中的每行

Add(S, max*2, temp, Alen + Blen – i);//每行相加

}

printf(―—–\n‖);

Print(S, max*2);

}

}四、输入一个N进制数,将其转换成M 进制数(1

#include

#include

#include

#include

#include

using namespace std;

相关文档
最新文档