我是靠谱客的博主 无情猫咪,这篇文章主要介绍华为机试 (9/22)放苹果(递归)二进制1的个数(n&() n-1)配置文件恢复百鸡问题日期问题参数解析,现在分享给大家,希望可以做个参考。

华为机试

  • 放苹果(递归)
  • 二进制1的个数(n&() n-1)
  • 配置文件恢复
  • 百鸡问题
  • 日期问题
  • 参数解析

放苹果(递归)

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
放苹果分为两种情况,一种是有盘子为空,一种是每个盘子上都有苹果。
令(m,n)表示将m个苹果放入n个盘子中的摆放方法总数。
1.假设有一个盘子为空,则(m,n)问题转化为将m个苹果放在n-1个盘子上,即求得(m,n-1)即可
2.假设所有盘子都装有苹果,则每个盘子上至少有一个苹果,即最多剩下m-n个苹果,问题转化为将m-n个苹果放到n个盘子上
即求(m-n,n)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h> int fun(int m,int n){ if(m==0||n==1){ return 1; }else if(m<n){ return fun(m,m); }else{ return fun(m-n,n)+fun(m,n-1); } } int main(){ int a,b,num; while(~scanf("%d%d",&a,&b)){ num = fun(a,b); printf("%dn",num); } }

二进制1的个数(n&() n-1)

n&(n-1)可以消去二进制中的0

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h> int main() { int a; int count = 0; while (scanf("%d", &a) != EOF) { while (a) { a &= (a - 1); count++; } printf("%dn", count); count = 0; } return 0; }

配置文件恢复

命 令 | 执 行
reset | reset what
reset board | board fault
board add | where to add
board delete | no board at all
reboot backplane | impossible
backplane abort | install first
he he | unknown command
注意:he he不是命令。
为了简化输入,方便用户,以“最短唯一匹配原则”匹配:
1、若只输入一字串,则只匹配一个关键字的命令行。例如输入:r,根据该规则,匹配命令reset,执行结果为:reset what;输入:res,根据该规则,匹配命令reset,执行结果为:reset what;
2、若只输入一字串,但本条命令有两个关键字,则匹配失败。例如输入:reb,可以找到命令reboot backpalne,但是该命令有两个关键词,所有匹配失败,执行结果为:unknown command
3、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果仍不唯一,匹配失败。例如输入:r b,找到匹配命令reset board 和 reboot backplane,执行结果为:unkown command。
4、若输入两字串,则先匹配第一关键字,如果有匹配但不唯一,继续匹配第二关键字,如果唯一,匹配成功。例如输入:b a,无法确定是命令board add还是backplane abort,匹配失败。
5、若输入两字串,第一关键字匹配成功,则匹配第二关键字,若无匹配,失败。例如输入:bo a,确定是命令board add,匹配成功。
6、若匹配失败,打印“unknown command”

复制代码
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
#include<stdio.h> #include<string.h> #include<ctype.h> char *cmdh[5]={"reset","board","board","reboot","backplane"}; char *cmdl[5]={"board","add","delete","backplane","abort"}; char *cmdout[5]={"board fault", "where to add", "no board at all", "impossible", "install first" }; int main() { char cmdin[100]; while(gets(cmdin)) { int n,len_1,len= strlen(cmdin);; int flag=0,pos=0,cnt=0; int index_o = 0; for(int n=0;n<len;n++) { if(cmdin[n]==' ') { flag=1; pos=n; break; } } if(flag == 1) { for(int n=0;n<5;n++) { if(strncmp(cmdh[n],cmdin,pos)==0 && strncmp(cmdl[n],cmdin+pos+1,len-pos-1)==0) { cnt++; index_o = n; } } if(cnt == 1) printf("%sn",cmdout[index_o]); else printf("unknown commandn"); } else{ if(strncmp("reset",cmdin,len)==0) { printf("reset whatn"); } else{ printf("unknown commandn"); } } } return 0; }

百鸡问题

鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdio.h" int main(void) { int n; while(~scanf("%d",&n)) { int i,j,k; //i是公鸡,j是母鸡,k是鸡仔 for(i=0;i<20;i++) { for(j=0;j<33;j++) { k=100-i-j; if((5*i+3*j+k/3 ==100)&&(k%3 ==0)) { printf("%d %d %d",i,j,k); printf("n"); } } } } return 0; }

日期问题

计算是一年的第几天

复制代码
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
#include<stdio.h> int Run(int a) { if(a%4==0) { if(a%400==0) return 1; if(a%100==0) return 0; return 1; } else return 0; } int main() { 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 a,b,c,day; while((scanf("%d",&a))!=EOF) { day=0; scanf("%d",&b); scanf("%d",&c); int i=0; for(i=0;i<b-1;i++) { if(Run(a)) day+=mon2[i]; else day+=mon1[i]; } day+=c; printf("%dn",day); } return 0; }

参数解析

在命令行输入如下命令:
xcopy /s c: d:,
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:
参数4: 字符串d:
请编写一个参数解析程序,实现将命令行各个参数解析出来。

解析规则:
1.参数分隔符为空格
2.对于用“”包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:program files” “d:”时,参数仍然是4个,第3个参数应该是字符串C:program files,而不是C:program,注意输出参数时,需要将“”去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入

复制代码
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> #include <string.h> int main() { char str[1000]; int len,count =0; int flag=0; gets(str); len = strlen(str); for (int i = 0; i < len; i++) { if (str[i] == '"') flag++; if ((flag % 2 == 0) && str[i] == ' ') count++; } printf("%dn", count + 1); flag = 0; for (int i = 0; i < len; i++) { if (str[i] == '"') flag++; if (str[i] != '"') { if ((flag % 2 == 0)&& (str[i] == ' ')) { printf("n"); } else printf("%c", str[i]); } } printf("n"); }

最后

以上就是无情猫咪最近收集整理的关于华为机试 (9/22)放苹果(递归)二进制1的个数(n&() n-1)配置文件恢复百鸡问题日期问题参数解析的全部内容,更多相关华为机试内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(90)

评论列表共有 0 条评论

立即
投稿
返回
顶部