相关蓝桥.docx
- 文档编号:27049420
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:35
- 大小:48.07KB
相关蓝桥.docx
《相关蓝桥.docx》由会员分享,可在线阅读,更多相关《相关蓝桥.docx(35页珍藏版)》请在冰豆网上搜索。
相关蓝桥
题目描述:
星期几
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;i scanf("%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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 相关
![提示](https://static.bdocx.com/images/bang_tan.gif)