相关蓝桥.docx
《相关蓝桥.docx》由会员分享,可在线阅读,更多相关《相关蓝桥.docx(35页珍藏版)》请在冰豆网上搜索。
![相关蓝桥.docx](https://file1.bdocx.com/fileroot1/2023-6/26/0d0a64bb-1de7-48c4-9a99-23d5cb8125ab/0d0a64bb-1de7-48c4-9a99-23d5cb8125ab1.gif)
相关蓝桥
题目描述:
星期几
1949年的国庆节(10月1日)是星期六。
今年(2012)的国庆节是星期一。
那么,从建国到现在,有几次国庆节正好是星期日呢?
只要答案,不限手段!
可以用windows日历,windows计算器,Excel公式,。
。
。
。
。
当然,也可以编程!
不要求写出具体是哪些年,只要一个数目!
千万不要提交源代码!
答案不要写在这里,写在“解答.txt”中
思路:
一般的日期计算,吧星期日当做星期7算就可以了,对所在天数取余,9月算完在加一天对七取余看看是不是7,如果是那么成立并输出答案,不是不成立。
注意:
闰年的判断,月份天数的判断(二月十分重要),边界问题。
AC代码:
#include
intRun(intyear)
{
if(year%400==0||(year%4==0&&year%100!
=0))
return1;
else
return0;
}
intmonth(intyear,intn)
{
intaws;
switch(n)
{
case1:
aws=31;break;
case2:
{
if(Run(year))
aws=29;
elseaws=28;
}break;
case3:
aws=31;break;
case4:
aws=30;break;
case5:
aws=31;break;
case6:
aws=30;break;
case7:
aws=31;break;
case8:
aws=31;break;
case9:
aws=30;break;
case10:
aws=31;break;
case11:
aws=30;break;
case12:
aws=31;break;
}
returnaws;
}
intmain()
{
inti,j,x,sum;
sum=5;
for(i=10;i<=12;i++)
{
sum+=month(1949,i);
}
for(i=1950;i<=2013;i++)//今天是2014年3月14日,所以算到2013年即可
{
for(j=1;j<=12;j++)
{
sum+=month(i,j);
if(j==9)
{
x=sum%7;
if(x+1==7)
printf("%d年的国庆节是星期日。
\n",i);
}
}
}
return0;
}
运送马匹
运送马匹
有1个人,要把n匹马从A村运往B村。
初始时,人和马都在A村。
每次骑1匹马牵1匹马,回来时骑1匹马。
已知每匹马从A村到B村需要的时间(数字越大越慢)
两匹马同行时只能迁就较慢者。
求所有马匹都运到B村的最小的运输时间(此时,人和马都在B村)。
程序首先输入一个整数n(n<100),表示有n匹马。
接着是n行整数,表示马从A村到B村的所用的分钟数(小于1000)
程序输出:
1个整数,表示所有马匹均运到B村的最小总耗时。
例如,
输入:
3
1
2
4
程序应输出:
7
输入:
4
1
4
2
5
程序应该输出:
12
对于编程题目,要求选手给出的解答完全符合ANSIC++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库,但不能使用MFC或ATL等非ANSIc++标准的类库。
例如,不能使用CString类型(属于MFC类库)。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意选择自己使用的编译环境。
思路:
选择两匹最快的马匹来回运送其它的马匹,最后的最后再将这两批最快的马匹运回就完成了
因为用到贪心思想,所以一开始要将马匹的速度从小到大排序,得到速度最快的前两个马匹,之后
运用递归的方法来运送马匹,一回合用最快的马运送两个(例如:
1,2,5,4,8:
排序后:
1,2,4,5,8;先用1,2,将1送到目的地,用时a[1],2返回
,用时a[1],之后速度倒数第二的马匹和速度倒数第一的马匹一起过去,用的时间是a[n-1](此时B地有马3匹,分别是1和a[n-2]和a[n-1]),
之后1再回去,用时a[0],一回合的用时就是a[1]*2+a[0]+a[n-1],此时运送了两匹马(a[n-2]和a[n-1])),直到运送完毕
#include
#include
usingnamespacestd;
inta[200],sum=0;
intFun(intn)
{
if(n==1)
sum+=a[0];
elseif(n==2)
sum+=a[1];
elseif(n==3)
sum+=a[1]+a[2];
else
{
sum+=2*a[1]+a[0]+a[n-1];//每一回合的式子
Fun(n-2);//运好两匹马之后递归
}
}
intmain()
{
inti,j,n,m1,m2;
scanf("%d",&n);
for(i=0;iscanf("%d",&a[i]);
sort(a,a+n);//排序(从小到大)
Fun(n);
printf("%d\n",sum);
return0;
}
画表格
画表格
在中文Windows环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来。
比如:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
└─┴─┘
其实,它是由如下的符号拼接的:
左上=┌
上= ┬
右上= ┐
左= ├
中心= ┼
右= ┤
左下= └
下= ┴
右下= ┘
垂直= │
水平= ─
本题目要求编写一个程序,根据用户输入的行、列数画出相应的表格来。
例如用户输入:
32
则程序输出:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
├─┼─┤
│ │ │
└─┴─┘
用户输入:
23
则程序输出:
┌─┬─┬─┐
│ │ │ │
├─┼─┼─┤
│ │ │ │
└─┴─┴─┘
对于编程题目,要求选手给出的解答完全符合ANSIC++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库,但不能使用MFC或ATL等非ANSIc++标准的类库。
例如,不能使用CString类型(属于MFC类库)。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意选择自己使用的编译环境。
思路:
先输出第一小排和最后一排,中间的交替,每一排不一样的字符中间交替
如2行4列用题中所给的小字符组合的话,需要的字符是5行9列,其它几组也看看就发现规律了,自己画图想想
代码仅供参考
#include
intmain()
{
inti,j,n,m,x,y,k;
while(scanf("%d%d",&n,&m)!
=EOF)
{
x=m*2+1;y=n*2+1;//转换(很重要,想想为什么,自己画画图就懂了)
printf("┌");
for(i=2;i<=x-1;i++)
{
if(i%2==0)
printf("─");
else
printf("┬");
}
printf("┐");
puts("");
for(i=2;i<=y-1;i++)
{
if(i%2==0)
{
for(j=1;j<=x;j++)
{
if(j%2!
=0)
printf("│");
else
printf("");
}
puts("");
}
else
{
printf("├");
for(k=2;k<=x-1;k++)
{
if(k%2==0)
printf("─");
else
printf("┼");
}
printf("┤");
puts("");
}
}
printf("└");
for(i=2;i<=x-1;i++)
{
if(i%2==0)
printf("─");
else
printf("┴");
}
printf("┘");
puts("");
}
return0;
}
硬币方案
硬币方案
有50枚硬币,可能包括4种类型:
1元,5角,1角,5分。
已知总价值为20元。
求各种硬币的数量。
比如:
2,34,6,8就是一种答案。
而2,33,15,0是另一个可能的答案,显然答案不唯一。
你的任务是确定类似这样的不同的方案一共有多少个(包括已经给出的2个)?
直接提交该数字,不要提交多余的内容。
思路:
什么也别想,比赛时间紧,而且只要求输出答案即可,直接暴力搜索!
小技巧:
5角,1角,5分化成浮点型数据(double)容易计算出错,把所有数去全乘以100,20块变成2000块,
1元,5角,1角,5分变成100元,50元,10元,5元。
整形计算出错率大大降低
AC代码:
#include
intb[1000][4];
intmain()
{
inti,j,x,p,k=0;
intn=2000;
for(i=0;i<=50;i++)
for(j=0;j<=50;j++)
for(x=0;x<=50;x++)
for(p=0;p<=50;p++)
{
if(i*100+j*50+x*10+p*5==n&&i+j+x+p==50)
{
b[k][0]=i;b[k][1]=j;b[k][2]=x;b[k][3]=p;
printf("%d%d%d%d\n",i,j,x,p);
k++;
}
}
for(i=0;i{
for(j=0;j<4;j++)
printf("%d",b[i][j]);
puts("");
}
printf("总数为:
%d\n",k);
while
(1);
return0;
}
歌赛新规则
歌赛新规则
歌手大赛的评分规则一般是去掉一个最高分,去掉一个最低分,剩下的分数求平均。
当评委较少的时候,如果我们只允许去掉一个分数,该如何设计规则呢?
有人提出:
应该去掉与其余的分数平均值相差最远的那个分数。
即“最离群”的分数。
以下的程序用于实现这个功能。
其中x存放所有评分,n表示数组中元素的个数。
函数返回最“离群”的那个分数值。
请补全缺失的代码。
doublescore(doublex[],intn)
{
inti,j;
doubledif=-1;
doublebad;
for(i=0;i{
doublesum=0;
for(j=0;j{
if(j!
=i)sum+=x[j];//除了要检测的那个分数不加外,其他分数计算总和
}
doublet=x[i]-sum/(n-1);//看看要检测的那个分数与剩下的所有的分数的平均值的差距
if(t<0)t=-t;//不要负数
if(t>dif)//如果大于上一次的几率,更新最大差距
{
dif=t;
bad=x[i];//记录最坏数
printf("%d,%f\n",i,x[i]);
}
}
returnbad;
}
n进制小数
n进制小数
将任意十进制正小数分别转换成2,3,4,5,6,7,8,9进制正小数,小数点后保留8位,并输出。
例如:
若十进制小数为0.795,则输出:
十进制正小数0.795000转换成 2进制数为:
0.11001011
十进制正小数0.795000转换成 3进制数为:
0.21011011
十进制正小数0.795000转换成 4进制数为:
0.30232011
十进制正小数0.795000转换成 5进制数为:
0.34414141
十进制正小数0.795000转换成 6进制数为:
0.44341530
十进制正小数0.795000转换成 7进制数为:
0.53645364
十进制正小数0.795000转换成 8进制数为:
0.62702436
十进制正小数0.795000转换成 9进制数为:
0.71348853
以下代码提供了这个功能。
其中,dTestNo表示待转的十进制小数。
iBase表示进制数。
请填写缺失的部分。
voidfun(doubledTestNo,intiBase)
{
intiT[8];
intiNo;
printf("十进制正小数%f 转换成%d 进制数为:
",dTestNo,iBase);
for(iNo=0;iNo<8;iNo++)
{
dTestNo*=iBase;
iT[iNo]=_____________;
if(________)dTestNo-=iT[iNo];
}
printf("0.");
for(iNo=0;iNo<8;iNo++) printf("%d",iT[iNo]);
printf("\n");
}
思路:
首先要了解“十进制数小数部分如何转化成n进制数”
十进制数0.3转化成二进制数的方法如下:
0.3×2=0.6……整数部分为0,记0;
0.6×2=1.2……整数部分为1,记1;
0.2×2=0.4……整数部分为0,记0;
0.4×2=0.8……整数部分为0,记0;
0.8×2=1.6……整数部分为1,记1; ...
voidfun(doubledTestNo,intiBase)
{
intiT[8];
intiNo;
printf("十进制正小数%f转换成%d进制数为:
",dTestNo,iBase);
for(iNo=0;iNo<8;iNo++)
{
dTestNo*=iBase;
iT[iNo]=(int)dTestNo;//如上面的计算方法,只取整数部分
if(____dTestNo>1____)dTestNo-=iT[iNo];
//如果整数部分不是0而大于0,要去掉整数部分,因为下一次只能计算小数部分
//再者想,本题是小数转化为n进制,dTestNo就是个小数,凭这一点第二个空也应该转化成小数了
}
printf("0.");
for(iNo=0;iNo<8;iNo++)printf("%d",iT[iNo]);
printf("\n");
}
中奖计算
中奖计算
某抽奖活动的规则是:
每位参与者在纸上写下一个8位数的号码。
最后通过摇奖的办法随机产生一个8位数字。
参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。
例如:
小张写的数字是:
12345678,而开奖号码是:
42347856。
则称小张中了3个号,因为其中最长的相同连续位是:
“234”。
如果小张写的是:
87654321,则他只中了一个号。
下面的代码根据传入的参数,返回中了几个号。
其中:
a表示被评价的号码,b表示摇号产生的数字。
请填写缺少的代码。
intg(inta,intb)
{
charsa[]="00000000";
charsb[]="00000000";
intn=0;
inti,j;
sprintf(sa,"%8d",a);
sprintf(sb,"%8d",b);
for(i=0;i<8;i++)
{
for(j=1;j<=8-i;j++)
{
chart=________;
sa[i+j]=0;
if(strstr(sb,sa+i))
{
if(j>n)_________;
}
sa[i+j]=t;
}
}
returnn;
}
首先要了解这两个函数:
sprintf与strstr
1>sprintf
sprintf
字串格式化命令,主要功能是把格式化的数据写入某个字符串中。
sprintf是个变参函数。
功能
把格式化的数据写入某个字符串缓冲区。
头文件
stdio.h
原型
intsprintf(char*buffer,constchar*format,[argument]…);
参数列表
buffer:
char型指针,指向将要写入的字符串的缓冲区。
format:
格式化字符串。
[argument]...:
可选参数,可以是任何类型的数据。
返回值:
字符串长度(strlen)
/*例子*/
#include//某个头文件
intmain()/*主函数“整数”类型*/
{
charbuffer[50];/*“字符”类型的数组,下面共有50个元素。
*/
intn,a=5,b=3;/*三个变量都为“整数”类型*/
n=sprintf(buffer,"%dplus%dis%d",a,b,a+b);/*赋予数值*/
printf("[%s]isastring%dcharslong\n",buffer,n);/*“格式输出”*/
return0;/*“返回零”
也就是程序正常退出*/
}
输出结果:
[5plus3is8]isastring13charslong
2>strstr
包含文件:
string.h
函数名:
strstr
函数原型:
externchar*strstr(char*str1,char*str2);
功能:
从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回null。
返回值:
返回该位置的指针,如找不到,返回空指针。
例子:
charstr[]="1234xyz";
char*str1=strstr(str,"34");
cout<显示:
34xyz
intg(inta,intb)
{
charsa[]="00000000";
charsb[]="00000000";
intn=0;
inti,j;
sprintf(sa,"%8d",a);
sprintf(sb,"%8d",b);
for(i=0;i<8;i++)
{
for(j=1;j<=8-i;j++)
{
chart=sa[i+j];//为了设置结束标签之后好还原sa[i+j]
sa[i+j]=0;//设置结束标签(我认为应该是'\0')
if(strstr(sb,sa+i))//从i一直对比到i+j
{
if(j>n)n=j;//如果出现比上一次记录的最长连续相等序列还长,就替换掉它
}
sa[i+j]=t;//把sa[i+j]还原回来
}
}
returnn;
}
程序设计题一
方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。
填充的规则是:
使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:
当n=3时,输出:
123
64
5
当n=4时,输出:
1234
9105
86
7
当n=5时,输出:
12345
1213146
11157
108
9
程序运行时,要求用户输入整数n(3~20)
程序输出:
方阵的上三角部分。
要求格式:
每个数据宽度为4,右对齐。
#include
#include
inta[30][30];
intmain()
{
inti,j,n,sum,num,k,m,x,pop;
while(~scanf("%d",&n))
{
sum=0;k=1;m=0;num=n,pop=1;
while(sum{
i=m;
if(k==1)
x=num;
else
x=num-pop++;
for(j=m;j{
if(sum==n*n-((n*n)/2)+n/2)
break;
a[i][j]=k++;
sum++;
}
j=x-2;
for(i=m+1;i{
if(sum==n*n-((n*n)/2)+n/2)
break;
a[i][j--]=k++;sum++;
}
j=m;
for(i=x-2;i>=m+1;i--)
{
if(sum==n*n-((n*n)/2)+n/2)
break;
a[i][j]=k++;sum++;
}
m++;num--;
}
m=n;
for(i=0;i{
for(j=0;j{
printf("%4d",a[i][j]);
}
m--;
puts("");
}
}
return0;
}
程序设计题二
公司发了某商店的购物券1000元,限定只能购买店中的m种商品。
每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案
第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入:
2
200
300
则应输出:
2
22
50
输入:
2
500
800
则应输出:
1
20
#include
#include
intcost;
intn;//物品个数
intprice[2000];//物品单价
intnu