第六届蓝桥杯省赛C语言B组 题解

第六届蓝桥杯省赛C语言B组
奖券数目
在这里插入图片描述
题意:

需要发出的奖券号码从10000-99999,但发出条件是这些号码里面不能含有数字4,问一共能发出多少张奖券。

思路:

把数字拆分,写入判断条件,再从10000到99999跑一遍循环。

代码
方法一:由于数据不大,就直接暴力枚举。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int sum=99999-10000+1;//奖券总数目
    for(int i=10000;i<=99999;i++)//把每一位都枚举出来
    {
    
    
        int a=i/10000;
        int b=i%10000/1000;
        int c=i%1000/100;
        int d=i%100/10;
        int e=i%10;
        if(a==4||b==4||c==4||d==4||e==4)//写入判断条件
            sum--;
    }
    cout<<sum<<endl;
    return 0;
}
//答案52488

方法二:针对多位数的数字拆分

#include<bits/stdc++.h>
using namespace std;
bool fun(int n)
{
    
    
    while(n)//把数字拆分
    {
    
    
     int x=n%10;
     if(x==4)//满足条件
   return true;
      n=n/10;
    }
}
int main()
{
    
    
     int sum=99999-10000+1;//奖券总数目
    for(int i=10000;i<=99999;i++)
    {
    
    
        if(fun(i))//满足条件
            sum--;
    }
    cout<<sum<<endl;
    return 0;
}

星系炸弹
在这里插入图片描述
方法一:

听说可以使用电脑自带计算器。就直接输入时间就行。由于只能输入的天数至多为999天,超过的就自己笔算吧。

在这里插入图片描述

方法二:

使用Excel表格,右键A与B,设置为日期模式,后在A里面输入日期,在B中输入=A1+1000,后enter。

在这里插入图片描述
在这里插入图片描述

答案就是2017-08-05(2017年8月5日)

三羊献瑞
在这里插入图片描述
题意:

这些文字由0-9不同的数字组成,并且这些数字组成的文字需要满足题中的等式。

思路一:

暴力枚举(就是费键盘,且代码行数多)

代码

#include<bits/stdc++.h>
using namespace std;
//祥a;瑞b;生c;辉d;三e;羊f;献g;气h;
int main()
{
    
    
for(int a=1;a<=9;a++)
{
    
    for(int b=0;b<=9;b++)
{
    
    if(b==a)continue;
{
    
    for(int c=0;c<=9;c++)
{
    
    if(c==a||c==b)continue;
{
    
    for(int d=0;d<=9;d++)
{
    
    if(d==a||d==b||d==c)continue;
{
    
    for(int e=1;e<=9;e++)
{
    
    if(e==a||e==b||e==c||e==d)continue;
{
    
    for(int f=0;f<=9;f++)
{
    
    if(f==a||f==b||f==c||f==d||f==e)continue;
{
    
    for(int g=0;g<=9;g++)
{
    
    if(g==a||g==b||g==c||g==d||g==e||g==f)continue;
{
    
    for(int h=0;h<=9;h++)
{
    
    if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;
{
    
    if(a*1000+b*100+c*10+d+e*1000+f*100+g*10+b==e*10000+f*1000+c*100+b*10+h)
 cout<<e<<" "<<f<<" "<<g<<" "<<b<<endl;
}}}}}}}} }}}}}}}}
//答案:1 0 8 5

思路二:

全排列

代码

//全排列
#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int a[10];
    for(int i=0;i<10;i++)
        a[i]=i;
    do{
    
    
        if(!a[0]||!a[4])continue;//每个数的第一位不能为0
        int x=a[0]*1000+a[1]*100+a[2]*10+a[3];
        int y=a[4]*1000+a[5]*100+a[6]*10+a[1];
        int z=a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];
        if(x+y==z)
        cout<<x<<" "<<y<<" "<<z<<endl;
    }while(next_permutation(a,a+10));
}
//答案 1 0 8 5

加法变乘法
在这里插入图片描述
题意:

根据题目中给的一串数字相加,改变其中两个不相邻的加号,使得结果为2015。

思路:

写两层for循环为了找出需要改变加号的位置,里面写入判断条件。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    for(int i=1;i<=49;i++)
    {
    
    
    for(int j=i+1;j<=49;j++)
 {
    
    
  if(1225+i*(i+1)+j*(j+1)-(i+i+1+j+j+1)==2015)
    cout<<i<<" "<<j<<endl;
} }return 0;}
//答案10  27//16 24

牌型种数
在这里插入图片描述
题意:

一副牌52张,发给四个人,每个人13张,不考虑花色,问一个人发到13张牌,其中组合共有多少种?

思路:

总共有13种牌,每一种牌有4张,对于每一种牌,抽取有5种情况,得到0,1,2,3,4牌。用times表示抽取的次数,sum表示手里的牌数。必须times=13,且手里的牌也等于13,组合数才能加1

方法一:暴力

代码

#include <iostream>
using namespace std;
int main()
{
    
    
int sum=0;
for(int a=0; a<=4; a++)
for(int b=0; b<=4; b++)
for(int c=0; c<=4; c++)
for(int d=0; d<=4; d++)
for(int e=0; e<=4; e++)
for(int f=0; f<=4; f++)
for(int g=0; g<=4; g++)
for(int h=0; h<=4; h++)
for(int i=0; i<=4; i++)
for(int j=0; j<=4; j++)
for(int k=0; k<=4; k++)
for(int l=0; l<=4; l++)
for(int m=0; m<=4; m++)
{
    
    if(a+b+c+d+e+f+g+h+i+j+k+l+m==13)
 sum++;}
cout<<sum<<endl;
 return 0;}
 //答案3598180

方法二:dfs

#include<bits/stdc++.h>
using namespace std;
int num=0;//统计方案次数
void dfs(int times,int sum)
{
    
    //times表示抽取次数,sum表示手中纸牌数量
    if(times>13||sum>13)//边界
    {
    
    
        return ;
    }
    if(times==13&&sum==13)//满足条件
     {
    
    
         num++;
         return ;
     }
     for(int i=0;i<5;i++)//每次抽取情况有五种,0,1,2,3,4张
     {
    
    
         sum+=i;
         dfs(times+1,sum);
         sum-=i;//回溯
     }
}
int main()
{
    
    
    dfs(0,0);
    cout<<num<<endl;
    return 0;
}
//答案3598180

移动距离
在这里插入图片描述
在这里插入图片描述
题意:

按照题目中的数字排位置,问其中任意两点的距离。

思路:

将输入的两个点的横坐标与纵坐标求出,后进行相减。求横纵坐标需要依情况而写,具体看代码。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int w,m,n;
    while(cin>>w>>m>>n)
    {
    
    
        int x1,x2,y1,y2;
        x1=m%w==0?m/w:m/w+1;
        x2=n%w==0?n/w:n/w+1;
        y1=x1%2==0?m-(x1-1)*w:x1*w-m+1;
        y2=x2%2==0?n-(x2-1)*w:x2*w-n+1;
    cout<<abs(x1-x2)+abs(y1-y2)<<endl;
    }return 0;
}

后面两道编程不会,求大佬教

如果觉得写的还不错点个赞吧!比心

猜你喜欢

转载自blog.csdn.net/m0_46669450/article/details/115329519