首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

网下转的几道题,求大家帮忙看看,真心多谢了,尤其是最后一道编程题,最好说说思路和代码,诺西的

2013-01-17 
网上转的几道题,求大家帮忙看看,真心谢谢了,尤其是最后一道编程题,最好说说思路和代码,诺西的诺西笔试2009

网上转的几道题,求大家帮忙看看,真心谢谢了,尤其是最后一道编程题,最好说说思路和代码,诺西的
诺西笔试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{


        if(S[low]*S[high] < prod){
             prod = S[low]*S[high];
        }
        --high;
    }
}
return prod;


[解决办法]
引用:
根据题意可以看出所有的数都满足这样一个条件,即可以分解成在它之间的两个数(已经得到的)的乘积。比如8 = 2* 4, 9 = 3*3。
假设已经得到前n个数,设序列为S, 那么Sn+1必然是前n个数中的两个数的乘积,该数是所有可能的乘积中最小的且大于第n个数。
感觉说得不清楚,试试用数学一点的表达: Sn+1 = min(a*b) 且a*b > Sn,其中a,b属于S……

想法是好的,不过你的算法不能保证最小,要用二层循环才行,这样还不如直接穷举效率高

[解决办法]
 int next(int *arr, int low, int high){
 19     int prod = arr[low] * arr[high];
 20     int prev = arr[high];
 21     while(low <= high){
 22         if(arr[low]*arr[high] <= prev)
 23             ++low;
 24         else{
 25             if(arr[low]*arr[high] < prod)
 26                 prod = arr[low]*arr[high];
 27             --high;
 28         }
 29     }
 30     return prod;
 31 }
 32
 33 int main(int argc, const char *argv[])
 34 {
 35     std::array<int, 1500> data{1,2,3,4,5,6,8,9,10};
 36     for(int i = 5; i < 1500; ++i)
 37         data[i] = next(data.data(), 1, i - 1);
 38     for(int i = 0; i < 15; ++i)
 39         cout << data[i] << endl;
 40     cout << data[1499] << endl;
 41     return 0;
 42 }


[解决办法]
引用:
引用:根据题意可以看出所有的数都满足这样一个条件,即可以分解成在它之间的两个数(已经得到的)的乘积。比如8 = 2* 4, 9 = 3*3。
假设已经得到前n个数,设序列为S, 那么Sn+1必然是前n个数中的两个数的乘积,该数是所有可能的乘积中最小的且大于第n个数。
感觉说得不清楚,试试用数学一点的表达: Sn+1 = mi……

请问为什么不可以保证最小?
[解决办法]
引用:
引用:引用:根据题意可以看出所有的数都满足这样一个条件,即可以分解成在它之间的两个数(已经得到的)的乘积。比如8 = 2* 4, 9 = 3*3。
假设已经得到前n个数,设序列为S, 那么Sn+1必然是前n个数中的两个数的乘积,该数是所有可能的乘积中最小的且大于第n个数。
感觉说得不清楚,试……


。。。。
你确定可以先算2*4后算3*3,3×5后4*4,3×8后5×5等等?
------解决方案--------------------


引用:
引用:引用:引用:根据题意可以看出所有的数都满足这样一个条件,即可以分解成在它之间的两个数(已经得到的)的乘积。比如8 = 2* 4, 9 = 3*3。
假设已经得到前n个数,设序列为S, 那么Sn+1必然是前n个数中的两个数的乘积,该数是所有可能的……

sry,没仔细看,是可以保证
[解决办法]
#include<stdio.h>
#include<assert.h>
char *strcpy1(char *strTest,const char *strSrc)
{  
   char *p = strTest;
   assert(NULL != strTest && NULL != strSrc);
   while(*p++ = *strSrc++);
   return strTest;
}
void main()
{
    char *strSrc = "Hello World";
char strTest[32];
char *p = NULL;
p = strcpy1(strTest,strSrc);
puts(p);
}
[解决办法]
最后一题,就是找丑数,记得好像是google面试题
解法看这里
http://zhedahht.blog.163.com/blog/static/2541117420094245366965/
[解决办法]
引用:
最后一题,就是找丑数,记得好像是google面试题
解法看这里
http://zhedahht.blog.163.com/blog/static/2541117420094245366965/

这个解法明显错吧,它把丑数理解为因数里只有2,3或者5三者之一,但这里的丑数是可以任意包含这三个因数
[解决办法]
引用:
引用:最后一题,就是找丑数,记得好像是google面试题
解法看这里
http://zhedahht.blog.163.com/blog/static/2541117420094245366965/
这个解法明显错吧,它把丑数理解为因数里只有2,3或者5三者之一,但这里的丑数是可以任意包含这三个因数

6难道不是既有2又有3?
[解决办法]
引用:
引用:引用:最后一题,就是找丑数,记得好像是google面试题
解法看这里
http://zhedahht.blog.163.com/blog/static/2541117420094245366965/
这个解法明显错吧,它把丑数理解为因数里只有2,3或者5三者之一,但这里的丑数是可以……

噢,看错了

热点排行