开辟了一篇文章,后面将陆续更新我收集到的一些嵌入式面试题目,剑指秋招!!!

[TOC]

目录

机试

机试主要内容,基于C语言和部分C++实现各种基本算法

  • 题目1:

题目描述

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

输入描述:

1
输入一个整数(int类型)

输出描述:

1
这个数转换成2进制后,输出1的个数

一个int占据4个字节,32位,所以对输入的数字遍历32次,输出count值

1
2
3
4
5
6
7
8
9
10
11
12
#include "stdio.h"
int main(void)
{
int dat,count=0;
scanf("%d",&dat);
for(int i=0;i<32;i++)
{
if((dat>>i)&0x01==1)
count++;
}
printf("%d",count);
}
  • 题目2:

题目描述

输入一个整数,将这个整数以字符串的形式逆序输出

程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

输入描述:

1
输入一个int整数

输出描述:

1
将这个整数以字符串的形式逆序输出

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdio.h"

int main(void)
{
int dat,num,i=0;
char str[10]={0};
scanf("%d",&dat);
while(dat!=0)
{
str[i]=dat%10+48;
dat/=10;
i++;
}

printf("%s",str);
}
  • 题目3:

题目描述

接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:

1
输入一行,为一个只包含小写字母的字符串。

输出描述:

1
输出该字符串反转后的字符串。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>

char s[1000];

int main()
{
scanf("%s", s);
int len = strlen(s);
while (--len >= 0) putchar(s[len]);
return 0;
}

  • 题目4:

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入描述:

1
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。

输出描述:

1
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

代码:

用递归写,有个更巧的方法直接除以2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "stdio.h"
int num1;
int get_num(int num)
{
int a,b,c,d=0;
a=num/3;
b=num%3;
d+=a;
c=a+b;
if(c==2)
{
d++;
return d;
}
else if(c>2)
{
d+=get_num(a+b);
return d;
}

else
return d;
}

int main(void)
{
scanf("%d",&num1);
while(num1)
{
printf("%d\n",get_num(num1));
scanf("%d",&num1);
}
return 0;
}


  • 题目5:

题目描述

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

本题有多组数据。

输入描述:

1
输入int型表示month

输出描述:

1
输出兔子总数int型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdio.h"


int get_num(int month)
{
if(month<=2)
return 1;
else
return (get_num(month-2)+get_num(month-1));
}

int main(void)
{
int num;
for(int i=0;i<2;i++)
{
scanf("%d",&num);
printf("%d\n",get_num(num));
}


return 0;
}
  • 题目6

题目描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。

输入描述:

1
输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder.com/discuss/276处理多组输入的问题。

输出描述:

1
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdio.h"

int main(void)
{
unsigned int x;
while(scanf("%x",&x)!=EOF)
{
printf("%d\n",x);
}
return 0;
}

  • 题目7

题目描述

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。s

输入n,请输出n以内(含n)完全数的个数。计算范围, 0 < n <= 500000

本题输入含有多组样例。

输入描述:

1
输入一个数字n

输出描述:

1
输出不超过n的完全数的个数

复杂度过高:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "stdio.h"

int main(void)
{
int num,p[1000],count,dat=0,l=0;
while(scanf("%d",&num)!=EOF)
{
for(int k=1;k<=num;k++)
{
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
if(k== (j*i))
{
p[l]=i;
if(i!=k)
count += p[l];
l++;
}

}
}
if(count==k)
{
dat++;
}
count=0;
l=0;
}
printf("%d\n",dat);
dat=0;
}
return 0;
}



简易方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
int num;
while(scanf("%d",&num)!=EOF)
{
int count=0;
if(num<6) count=0;
else if(num<28) count=1;
else if(num<496) count=2;
else if(num<8128) count=3;
else
count=4;
printf("%d\n",count);
}
return 0;
}
  • 题目8

题目描述

输入一个正整数,计算它在二进制下的1的个数。

注意多组输入输出!!!!!!

输入描述:

1
输入一个整数

输出描述:

1
计算整数二进制中1的个数

代码:

简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdio.h"


int main (void)
{
int num,count=0;
while(~scanf("%d",&num))
{
while(num)
{
if(num&0x01!=0)
count++;
num=num>>1;
}
printf("%d\n",count);
count=0;
}
return 0;
}

  • 题目9

题目描述

公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

详细描述:

接口说明

原型:

int GetResult(vector &list)

输入参数:

​ 无

输出参数(指针指向的内存区域保证有效):

list 鸡翁、鸡母、鸡雏组合的列表

返回值:

-1 失败

0 成功

输入描述:

1
输入任何一个整数,即可运行程序。

输出描述:

1
2
3
4
0 25 75
4 18 78
8 11 81
12 4 84

代码:

暴力破解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdio.h"

int main (void)
{
while(~scanf("%d"))
{
for(int i=0;i<=20;i++)
{
for(int j=0;j<=33;j++)
{
for(int k=0;k<=100;k++)
{
if((5*i+3*j+k) == 100 && (i+j+3*k==100))
{
printf("%d %d %d \n",i,j,3*k);
}
}
}
}
}

}

  • 题目10

题目描述

根据输入的日期,计算是这一年的第几天。。

测试用例有多组,注意循环输入

输入描述:

1
输入多行,每行空格分割,分别是年,月,日

输出描述:

1
2
成功:返回outDay输出计算后的第几天;
失败:返回-1

code:

代码效率奇低,早该考虑到使用,数组储存好月份数据,直接遍历!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "stdio.h"
#include "string.h"

int mon1[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int mon2[12]={31,29,31,30,31,30,31,31,30,31,30,31};

int main(void)
{
char str[10]={NULL};
int mark=0,i=0,ten=1,year=0,mon=0,day=0,days=0;
while(~scanf("%s",str))
{
i=0;
while(str[i]!= '\0')
{
i++;
}
if(mark==0)
{
while(i)
{
i--;
year+=(str[i]-48)*ten;
ten*=10;
}
ten=1;
mark=1;
}else if(mark ==1)
{
while(i)
{
i--;
mon+=(str[i]-48)*ten;
ten*=10;
}
ten=1;
mark=2;
}else
{
while(i)
{
i--;
day+=(str[i]-48)*ten;
ten*=10;
}
ten=1;
mark=0;
}

if(mark==0)
{
if(year%4!=0)
{
for(int j=0;j<mon-1;j++)
{
days += mon1[j];
}
days += day;
}else
{
for(int j=0;j<mon-1;j++)
{
days += mon2[j];
}
days += day;
}
printf("%d\n",days);
days=0;
mon=0;
year=0;
day=0;
}
}


return 0;
}

面试

wechat