网下转的几道题,求大家帮忙看看,真心多谢了,尤其是最后一道编程题,最好说说思路和代码,诺西的
网上转的几道题,求大家帮忙看看,真心谢谢了,尤其是最后一道编程题,最好说说思路和代码,诺西的
诺西笔试2009.10 1楼
今天下午诺西笔试,赶过去参与了一下。凭印象谈谈吧。
共有9个题目。整体而言,比较基础。
第一题,求与,或,异或;第二题,sizeof()占用空间的计算;第三题,指针有关;第四题,指针和常量的结合运算;第五题,统计1?个word(32bit)里面的1的bit数;第六题,程序改错,注意溢出问题;第七题,strcp()的实现;第八题,考虑并行处理的时间;第九题,这题是以前的acm题目,找出因子只有2,3,5的第1500个数,如1,2,3,4,5,6,8,9,10为满足条件的数,设计有效算法。当时没有想出来,后来想想,不超过30行的代码。
------解决方案--------------------
------解决方案--------------------
int fun(int count)
{
int nCount = 0;
int num =1;
int temp =num;
while(1) {
if(1 == temp){
nCount ++;num++;temp=num;continue; }
if(nCount == count){
cout<<"因子为2,3,5的第"<<count<<“个数为”<<num;return num; }
if(0 == temp%2){
temp = temp >>1;continue; }
if(0 == temp%3){
temp =temp/3;continue; }
if(0 == temp%5){
temp=temp/5;continue; }
num ++;
temp =num;
}
}
------解决方案--------------------
根据题意可以看出所有的数都满足这样一个条件,即可以分解成在它之间的两个数(已经得到的)的乘积。比如8 = 2* 4, 9 = 3*3。
假设已经得到前n个数,设序列为S, 那么Sn+1必然是前n个数中的两个数的乘积,该数是所有可能的乘积中最小的且大于第n个数。
感觉说得不清楚,试试用数学一点的表达: Sn+1 = min(a*b) 且a*b > Sn,其中a,b属于S。
这样问题就转化为一个找满足条件的乘积问题:
诺西笔试2009.10 1楼
今天下午诺西笔试,赶过去参与了一下。凭印象谈谈吧。
共有9个题目。整体而言,比较基础。
第一题,求与,或,异或;第二题,sizeof()占用空间的计算;第三题,指针有关;第四题,指针和常量的结合运算;第五题,统计1?个word(32bit)里面的1的bit数;第六题,程序改错,注意溢出问题;第七题,strcp()的实现;第八题,考虑并行处理的时间;第九题,这题是以前的acm题目,找出因子只有2,3,5的第1500个数,如1,2,3,4,5,6,8,9,10为满足条件的数,设计有效算法。当时没有想出来,后来想想,不超过30行的代码。
------解决方案--------------------
int fun(int count)
{
int nCount = 0;
int num =1;
while(1)
{
if(1 == num){
nCount ++;continue;
}
if(nCount == count){
cout<<"因子为2,3,5的第"<<count<<“个数为”<<num;return num;
}
if(0 == num%2){
num >>1;continue;
}
if(0 == num%3){
num =num/3;continue;
}
if(0 == num%5){
num =num/5;continue;
}
num ++;
}
}
------解决方案--------------------
int fun(int count)
{
int nCount = 0;
int num =1;
int temp =num;
while(1) {
if(1 == temp){
nCount ++;num++;temp=num;continue; }
if(nCount == count){
cout<<"因子为2,3,5的第"<<count<<“个数为”<<num;return num; }
if(0 == temp%2){
temp = temp >>1;continue; }
if(0 == temp%3){
temp =temp/3;continue; }
if(0 == temp%5){
temp=temp/5;continue; }
num ++;
temp =num;
}
}
------解决方案--------------------
根据题意可以看出所有的数都满足这样一个条件,即可以分解成在它之间的两个数(已经得到的)的乘积。比如8 = 2* 4, 9 = 3*3。
假设已经得到前n个数,设序列为S, 那么Sn+1必然是前n个数中的两个数的乘积,该数是所有可能的乘积中最小的且大于第n个数。
感觉说得不清楚,试试用数学一点的表达: Sn+1 = min(a*b) 且a*b > Sn,其中a,b属于S。
这样问题就转化为一个找满足条件的乘积问题:
low = 1; high = n - 1;下标从0开始
prod = S[low] * S[high];
while(low <= high){
if(S[low]*S[high] <= S[n-1]){
++low;
}else{