读书人

笔试碰到的题目 求解

发布时间: 2012-10-16 09:57:37 作者: rapoo

笔试遇到的题目 求解
一:一人可以投资n平方米的地产,m种户型,面积为house[m],可能的所有投资方案。算法。
二:计算一字符串在2进制下的1的个数。
三:给定一整数n,输出所有长度为n的数字,相邻俩数字不能相同,如n=3,112不行,121可以。

[解决办法]
第二个:

C/C++ code
#include <math.h>int count(const int n){     if(n<0) return -1;     int m = (int)(log10(n)/log10(2));      int result = 0;     for(int i=0; i<m; i++)     {          if(n % pow(2,i+1) >= pow(2,i)) result++;     }     return result;}
[解决办法]
楼上有些错误,正确的在这里:
C/C++ code
#include <stdio.h>#include <math.h>int count(const int n){     if(n<0) return -1;     int m = 1 + (int)(log10(n)/log10(2));      int result = 0;     int i;     for(i=0; i<m; i++)     {          if(n % (int)pow(2,i+1) >= pow(2,i)) result++;     }     return result;}int main(){    int n;    scanf("%d",&n);    printf("%d\n",count(n));    return 0;}
[解决办法]
第二题
C/C++ code
#include <iostream>using namespace std;int BinaryNum(const char* str){    int num = 0;    while (*str != '\0')    {        int x = (int)(unsigned char)(*str);        int i = 0;        while (x != 0)        {            x = x & (x - 1);            i++;        }        str++;        num += i;    }    return num;}int main(){    cout << BinaryNum("Hello World~!!!") << endl;    return 0;}
[解决办法]
第三题,请指教!
C/C++ code
#include <stdio.h>#include <stdlib.h>void foo(int a[], int len, int pos, int pre_num){    if(pos==len)    {        int i;        for(i=0; i<len; ++i)        {            printf("%d ", a[i]);        }        printf("\n");        return;    }    else    {        int i;        for(i=0; i<10; ++i)        {            if(i!=pre_num)            {                a[pos] = i;                foo(a, len, pos+1, i);            }        }    }}void fun(int n){    int *a = (int*)malloc(sizeof(int)*n);     foo(a, n, 0, -1);}void main(){    int n = 4;    fun(n);    return;}
[解决办法]
第三题:
#include <iostream.h>
#include <math.h>
int main()
{
int n;
cin>>n;
int j;
double temp;
int tmp;
for(double i=pow(10,n-1);i<pow(10,n);i++)
{
int temp=int(i);
j=0;
while(temp!=0)
{
int tmp=temp%10;
temp=temp/10;
if(tmp==temp%10)j=1;
}
cout.width(5);
if(0==j)cout<<i;
}
return 0;
}
[解决办法]
第一题:
C/C++ code
#include <stdio.h>#include <stdlib.h>void fff(int n, int m, int *house){    int *a = (int*)malloc(sizeof(int)*m);    int i;    for(i=0; i<m; ++i)    {        a[i] = 0;    }    int sum;    for(;;)    {        sum = 0;        int i;        for(i=0; i<m; ++i)        {            sum += a[i]*house[i];        }        if(sum<=n)        {            for(i=0; i<m; ++i)            {                printf("第%d种户型买 %d 套,    ", i+1,a[i]);            }            printf("\n");            ++a[m-1];        }        else        {            ++a[m-2];            int i;            for(i=m-2; i>-1; --i)            {                if(a[i]>n/house[i] && i>0)                {                    ++a[i-1];                }                else                {                    int j;                    for(j=i+1; j<m; ++j)                    {                        a[j] = 0;                    }                    break;                }            }            if(i==-1)            {                break;            }        }    }}void main(){    int n = 9;    int m = 3;    int house[3] = {2,3,4};    fff(n, m, house);    return;} 


[解决办法]
第二题既然是字符串,那每种字符的二进制1个数是确定的,开个数组索引累加即可。。。

读书人网 >C++

热点推荐