《金山面试题》由会员分享,可在线阅读,更多相关《金山面试题(7页珍藏版)》请在金锄头文库上搜索。
1、Welcome To Kingsoft姓名: 林道疆 日期: 2007 年 8 月 17 日 答题时间: 一、请你就 C/C+或者 JAVA 代码行数、注释行数统计工具的实现,描述一下:1、 需要考虑哪些过滤条件?你如何处理?答:过滤条件:(取得每行并去掉两头的空格后)空行,行的长度为 0;如果是以/开头,为注释行; /在行中,并判断不是在字符串中,即“”中,为代码+注释混合行,/在“”中时为代码行; 如果/*在行中,判断是否是在“”内,否则为注释行,*/不在 “”中时是结束 ;/* */只在一行,判断行中是否有代码,无代码为注释行,有代码是混合行;/* */多行,并且/*前无代码,/*后无代
2、码,去掉其中空行都是注释行;/* */多行,/*在代码后,或*/后有代码,有混合行;一行中有 2 个/*并且就 1 个*/,此行为混合行,其后是注释行。2、 怎样提升这个工具的易用性?答:把这个工具设置成图形界面,用户只需输入文件名或者在文件对话框中选择文件即可点击运行输出结果。本题只需要提供思路文档,不需要程序代码。二、给定一个自然数 n,试完成如下程序,它输出不大于 n 的所有素数(质数) 。1、 请提供程序代码,以及思路文档。答:思路:求出一个数 j 的平方根 sqrt(j),将 j 除以 2sqrt(j)之间的数,只要除尽一次,就不是素数,之后数 j 加 2。#include#incl
3、udevoid main() int N=1000;int i,j,k,m=0;for(j=1;jk) /*/除到 k 一直没除尽,是素数 */ printf(%d ,j);3、 请分析一下可以从哪些角度可优化该程序的时间性能?答:偶数(除了 2)不能为素数;判断一个数 j 是否为素数,只要将其除以 2 sqrt(j)之间的素数,更进一步,没有必要对所有奇数进行试除,只需对所有 sqrt(j)以内的所有质数试除就可以了。三、高精度乘法用户输入两个不大于 256 位的正整数,由程序进行乘法运算,并显示运算过程与结果。例:输入:12, 32输出: #include #include #includ
4、e #define max 256int Amax,Bmax;int Alen,Blen;int Smax *2;void InputAB() /输入 A B int c;while (!isdigit(c = getchar() ;Alen=1;A0= c - 0;while (isdigit(c = getchar()AAlen+ = c - 0;while (!isdigit(c = getchar() ;Blen = 1;B0 = c - 0;while (isdigit(c = getchar()BBlen+ = c - 0;void Print(int Array, int len
5、) /输出数组 int i=0;while (i= 0; i-)Resulti+1 = Array*n;Result0 = 0;for (i = len; i 0; i-) if (Result = 10) /大于 10 的进位 Resulti-1 +=Result / 10;Result %= 10;for (i = 1; i 0) & (alen 0) /相加 tlen-;alen-;totaltlen += addalen;for (i = k - 1; i=0; i-)if (total = 10) /大于 10 的进位 totali - 1 += total / 10;total %
6、= 10;void main() int i,j;int tempmax*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, temp, Blen - 1 -i);/B 中的一个数与 A 的所有数相乘Print(temp, Alen + 1); /输出相乘过程中的每行Add(S, max*2, temp, Alen + Blen - i);/每行相加print
7、f(-n);Print(S, max*2);四、输入一个 N 进制数,将其转换成 M 进制数(1#include #include #include #include using namespace std;int main()char digit16 = 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;cout =0&aj=a&aj=A&ajn;assert(n1)int num=0;for(i=0,j=length-1;j=0;j-,i+)/输入的数转成十进制num+=b*pow(n,j);cout m;cout 1)stack stk;char remain;while
8、(num!=0)/转成 M 进制remain = digitnum%m;stk.push(remain);num/= m;cout #include #include #include #include #include using namespace std;int word_find(const char t, int m, const char s, int n ,vector& colpos)/查找单词,char t为单词,m 单词长度,char s为行,n 行的长度,colpos 记录找到单词所在的位置 int i=0,j=0,cnt=0;while(j= m) if(!isalph
9、a(sj)&!isalpha(sj-m-1)/字符串前后不是字母时是单词 colposcnt+ = j - m ;/单词的第一个字符所在的行下标i=0; /单词串下标重置为 0if(cnt = colpos.size()colpos.resize(cnt * 2);/长度重设为原来 2 倍 else i=0; else if (sj=t) +i;+j; else j=j-i+1; i=0; /下标后退重新开始匹配 return cnt;/返回查到的个数int count_string(string source, string target, vector& colpos) int find_
10、cnt = 0;find_cnt = word_find(target.c_str(), target.size(), source.c_str(),source.size(),colpos);return find_cnt;/返回查到的个数int main()string file_name, line;vector lines;lines.resize(10);cout file_name;ifstream in_file; /打开文件tryin_file.open(file_name.c_str();if(!in_file)throw(file_name);catch(string fi
11、le_name) cout colpos;/单词中第一个字符所在位置colpos.resize(10);docout tag;if(tag = #) break; int count = 0, line_no = 0 , inline_count;/line_no 是行号,第?行for(line_no = 0 ;line_no 0)cout 在第 line_no 行找到 inline_count个 tag;cout ,所在位置是 ;for(int i = 0 ;i inline_count ;i+)cout colpos ;/输出位置cout endl;cout linesline_no endl;/输出行,未作着重显示while(tag != #);in_file.close();return 0;