第六届蓝桥杯省赛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;
}
后面两道编程不会,求大佬教
如果觉得写的还不错点个赞吧!比心