2014年第五届蓝桥杯B组(C/C++)预赛题目及个人答案(欢迎指正)

1.标题:啤酒和饮料


    啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。


    我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。


    注意:答案是一个整数。请通过浏览器提交答案。


    不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。


一开始用直接用题目中的带有小数点的数据运行不出来,上下乘以10以后再计算就出来了,所以说,在蓝桥杯比赛中对于这种只需要填出最终结果的小题,能用整形就用整形,避免浮点型的数以防出错。

#include<stdio.h>
int main()
{
    for(int i=0; i<=823/23; i++)
        for(int j=i+1; j<=(823-23*i)/19; j++)
            if(23*i+19*j==823)
                printf("%d\n",i);
    return 0;
}

运行结果:11


2.标题:切面条


    一根高筋拉面,中间切一刀,可以得到2根面条。


    如果先对折1次,中间切一刀,可以得到3根面条。


    如果连续对折2次,中间切一刀,可以得到5根面条。


    那么,连续对折10次,中间切一刀,会得到多少面条呢?


答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。


自己模拟剪几下,找出规律。

#include<stdio.h>
int main()
{
    int ans=2;
    for(int i=1; i<=10; i++)
        ans=ans*2-1;
    printf("%d\n",ans);
    return 0;
}

运行结果:1025



3.标题:李白打酒


    话说大诗人李白,一生好饮。幸好他从不开车。


    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:


    无事街上走,提壶去打酒。
    逢店加一倍,遇花喝一斗。


    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 


    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。


    注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。


DFS,注意判断条件,以及搜索方法。

#include<stdio.h>
int ans=0;
char s[15];
void dfs(int a,int b,int jiu,int sum)
{

    if(!jiu&&!a&&!b&&s[14]=='b')//尤其注意这里的条件设置:酒喝光了,遇到了5个店,10朵花,最后遇到的是花。
    {
        ans++;
        return ;
    }
    if(a>0)
    {
        s[sum]='a';
        dfs(a-1,b,jiu*2,sum+1);
    }
    if(b>0&&jiu>0)
    {
        s[sum]='b';
        dfs(a,b-1,jiu-1,sum+1);
    }
}
int main()
{
    int jiu=2;
    dfs(5,10,jiu,0);
    printf("%d\n",ans);
    return 0;
}


运行结果:14



4.标题:史丰收速算


    史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!


    速算的核心基础是:1位数乘以多位数的乘法。


    其中,乘以7是最复杂的,就以它为例。


    因为,1/7 是个循环小数:0.142857...,如果多位数超过 142857...,就要进1


    同理,2/7, 3/7, ... 6/7 也都是类似的循环小数,多位数超过 n/7,就要进n


    下面的程序模拟了史丰收速算法中乘以7的运算过程。


    乘以 7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。


    乘以 7 的进位规律是:
满 142857... 进1,
满 285714... 进2,
满 428571... 进3,
满 571428... 进4,
满 714285... 进5,
满 857142... 进6


    请分析程序流程,填写划线部分缺少的代码。




//计算个位 
int ge_wei(int a)
{
if(a % 2 == 0)
return (a * 2) % 10;
else
return (a * 2 + 5) % 10;
}


//计算进位 
int jin_wei(char* p)
{
char* level[] = {
"142857",
"285714",
"428571",
"571428",
"714285",
"857142"
};

char buf[7];
buf[6] = '\0';
strncpy(buf,p,6);

int i;
for(i=5; i>=0; i--){
int r = strcmp(level[i], buf);
if(r<0) return i+1;
while(r==0){
p += 6;
strncpy(buf,p,6);
r = strcmp(level[i], buf);
if(r<0) return i+1;
______________________________;  //填空
}
}

return 0;
}


//多位数乘以7
void f(char* s) 
{
int head = jin_wei(s);
if(head > 0) printf("%d", head);

char* p = s;
while(*p){
int a = (*p-'0');
int x = (ge_wei(a) + jin_wei(p+1)) % 10;
printf("%d",x);
p++;
}

printf("\n");
}


int main()
{

  • 23
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值