华为机试 (9/22)

放苹果(递归)

把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("%d\n",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("%d\n", 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("%s\n",cmdout[index_o]);
            else printf("unknown command\n");
        }
        else{
            if(strncmp("reset",cmdin,len)==0)
            {
                printf("reset what\n");
            }
            else{
                printf("unknown command\n");
            }
        }
    }
    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("%d\n",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("%d\n", 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");

} 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值