概述
华为机试
- 放苹果(递归)
- 二进制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)
#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
#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”
#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;
}
百鸡问题
鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
#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;
}
日期问题
计算是一年的第几天
#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.输入由用例保证,不会出现不符合要求的输入
#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)配置文件恢复百鸡问题日期问题参数解析的全部内容,希望文章能够帮你解决华为机试 (9/22)放苹果(递归)二进制1的个数(n&() n-1)配置文件恢复百鸡问题日期问题参数解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复