笔试遇到的题目 求解
一:一人可以投资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个数是确定的,开个数组索引累加即可。。。