- HGNU
『小白杯』黄冈师范学院程序设计第一届新生赛题解
- 2021-11-14 21:29:37 @
『小白杯』黄冈师范学院程序设计第一届新生赛题解
(正赛与热身赛的所有代码在最下方)
Problem 1. 肖飞老师的新闰年
签到题。该题看似是在更改闰年的概念,实际上就是输入一个数,然后判断这个数是否能同时整除 和 。如果这个数可以同时整除,则输出 Yes!
;如果不能同时整除,则输出 No!
,因此代码只需使用 if...else...
判断语句 n%6==0&&n%17==0
即可。该题唯一的“坑”在于输出的 Yes!
和 No!
是首字母大写,其他字母小写,但可以通过复制题面或样例避免。
Problem 2. 找出含7的数
该题是要判断输入的数字里是否包含7,而不是判断输入的数字能否整除7。要判断输入的数字里是否包含 ,即判断输入的数字是否有哪一位是 。要想对数字的每一位进行处理,就得反复对 取余进行查找,每次检查完后,将数字除以 ,即将已检查过的数位除掉。
Problem 3. Mr. Young's Problem
With the rapid development of Artificial Intelligence(AI), it is becoming more and more convenient when we are using robots. Recently, the metaverse concept is getting explosion, which is a imagination of the future that the people will socialize in a virtual world called metaverse. What's more fantastic, even the Facebook company changed its name to "Meta" in order to catch up with the "metaverse" topic.
这段话就是套路,基本不用看,只是给这个题一个文字背景,纯手打。想读懂也很容易,读不懂就百度翻译吧~
Mr. Young is going to develop a robot that simulates the communication between human, and has a problem while making this kind of robot: How to make a robot that automaticly interacts with human and correctly answer the questions human made? So He came up with a plan:
When a human says "1", then it answers with "I'm fine, thanks.".
When a human says "2", then it answers with the number of today
When a human says "3", then check whether the number given is even. If yes, it will answer with . Otherwise it will answer with
杨先生打算开发一款能够模拟人类交流的机器人,但是他在制作这种机器人的时候遇到了问题:怎样才能使机器人自动跟人类交互并且正确回答人类提出的问题?
所以他想出了这样的办法:
-
当人说出 的时候,它会回答
-
当人说出 的时候,它会回答今天是几号
-
当人说出 的时候,它会判断给出的数是否为偶数。如果是,它就会回答
yes
,否则它会回答no
这道题其实非常简单,主要是考察大家的英语水平,大家的理解重难点大概在 和 上, 实际上是想让你输出今天是几号,也就是比赛那天(),从字面上是比较好理解的,而 则为偶数的意思,多义词,通常的意思是”甚至”。
Problem 4. Fibonacci's supplementary numbers
首先根据题面了解斐波那契数列的概念以及生成方式,然后判断 小于 的情况,并分别输出结果。
接着判断 的情况,在判断之前先把前两项输出出来。使用 循环进行遍历,在循环体内处理当前得到的最新斐波那契数。
先得到前两项之和 ,然后把第一项的值赋值为原第二项的值 ,第二项的值赋值为刚刚得到的两项之和 ,这个时候,我们已经得到了当前最新的一个斐波那契数。
接着我们处理这个斐波那契数,我们要得到它的最小补数并且让个位为 ,则有两种情况:
- 如果个位数小于等于 ,我们可以让个位加上一个数得到 ,那么用 减去个位数即可 ;
- 如果个位数大于 ,那么我们要加上一个数来让个位数为 ,那么大于个位数且最小的数是 ,那么这个补数则是 减去个位数 。
最后直接在当前循环内输出这个数的补数即可。
Problem 5. 最美的数
这道题在题面里标注了指数的数据范围为:。而在C语言中,int
型数据最大值为 ,如果直接用 pow()
函数计算 ,那么C语言肯定是无法计算出这个幂的值的。这个时候就应该想到找规律, 的 次方结果分别为: ,除了 次方较为特殊需要加前导 ,后续几个数可以很明显地看出规律:如果指数为奇数,则输出 ;如果指数为偶数,则输出 。
Problem 6. 素数数组
“任何大于2的偶数可以写成两个质数的和”是著名的哥德巴赫猜想。如果给的数是素数直接输出 ,如果给的数是偶数由上面的思想可得出 ,如果是奇数,奇数可以为偶数加奇数所以为 。
Problem 7. Bishop Attack!!
热身赛第三题的升级版,只需要在之前题目上进行改进就行。
自己多模拟几遍就会发现,答案只有四个答案
我们把棋盘看作成一个直角坐标系,然后把位置转换成 数值坐标,然后再来判断奇偶性和一些特殊情况。
先考虑 ,棋盘的格子有绿白两种颜色,斜着移动只能移动到同色的格子上,所以主教和国王在不同色的格子上时,不可能到达,不用考虑士兵的位置,只需要判断两点x和y的和是否都是奇数或都是偶数就行。 还有四种特殊情况,那就是考虑士兵的位置,士兵把主教或者国王堵死在了四个角落里。如:主教,士兵 。
答案为 时,主教和国王会在一条 的斜线上,中间没有士兵阻挡,主教一步就可以到达国王的位置;直接判断两点的 差的绝对值和两点的 差的绝对值是否相等即可。
答案为 时,主教和国王在一条 的斜线上,但是中间有士兵阻挡;需要判断士兵和主教在一一条 的斜线上,且士兵x的值需要在国王和主教的 的值之间,士兵的 的值需要在国王和主教 的值之间。
因为士兵只会出现在主教周围,所以其他情况只会是 ,主教和国王不在一条斜线上,士兵在任意位置。
Problem 1. 肖飞老师的新闰年
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d",&n);
if(n%6==0&&n%17==0) { // 判断n是否能同时整除6和17
printf("Yes!");
}
else {
printf("No!");
}
return 0;
}
Problem 2. 找出含7的数
#include<stdio.h>
int total,nums[1000]; //创建数组总数变量与数组变量
int main()
{
scanf("%d",&total);
int Circle=0;
for(Circle=0;Circle<total;Circle++)
{
scanf("%d",&nums[Circle]);
}
for(Circle=0;Circle<total;Circle++)
{
int flag=0;
int num=nums[Circle];
while(num) { //当num不为0时运行
if(num%10==7) { //对10取余查找7
flag=1;
break;
}
num/=10; //将已检查过的数位除掉
}
if(flag==1)
printf("%d ",Circle+1); //含7输出序号
}
return 0;
}
Problem 3. Mr. Young's Problem
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
if(a==1) printf("I'm fine, thanks.\n");
else if(a==2) printf("14\n");
else if(a==3)
{
int num;
scanf("%d",&num);
if(num%2==0) printf("yes\n");
else printf("no\n");
}
}
return 0;
}
或使用 swtich
解题
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
switch(a)
{
case 1:printf("I'm fine, thanks.\n");break;
case 2:printf("14\n");break;
case 3:
{
int num;
scanf("%d",&num);
if(num%2==0) printf("yes\n");
else printf("no\n");
break;
}
}
}
return 0;
}
Problem 4. Fibonacci's supplementary numbers
#include <stdio.h>
int main(){
int n;
scanf("%d",&n); // 输入长度n
int a=0;
int b=1;
if(n==0){
return 0; //长度为0直接退出程序
}
if(n==1){
printf("5 "); // 长度为1 输出一个5,然后退出程序
return 0;
}
if(n==2){
printf("5 4 "); // 长度为2 输出前两项然后退出程序
return 0;
}
int c; // 定义前两项之和变量
int res; // 定义单个输出结果的变量
printf("5 4 "); // 这个时候大于或等于3,先输出前两项
for (int i = 3; i <= n; i++) { // 处理长度大于等于3的情况
c = a + b; // 第三项等于前两项之和
a = b; // 更新前两项的第一项
b = c; // 更新前两项的第一项
int z = c % 10; // 因为要得到个位为5的最小数,根据个位数的大小来判断
if (z<=5){ // 如果个位小于等于5 ,那么补数是5减去个位数
res = 5-z;
} else{ // 如果个位大于5,那么补数是15 减去个位数
res = 15-z;
}
printf("%d ",res); // 从第三项开始,挨个输出各个数字(空格不要忘记了)
}
return 0;
}
Problem 5. 最美的数
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n;
scanf("%d",&m);
while(m--){
scanf("%d",&n);
if(n==0) {
printf("001");
}
else if(n==1) {
printf("005");
}
else if(n==2) {
printf("025");
}
else if(n%2==1) {
printf("125");
}
else {
printf("625");
}
printf("\n");
}
}
Problem 6. 素数数组
#include <stdio.h>
int main() {
int n,f=1;
scanf("%d",&n);
for(int i=2;i<n;i++) {
if(n%i==0) {
f=2;
break;
}
}
if(f==1) {
printf("1");
}
else {
if(n%2==0)
printf("2");
else
printf("3");
}
return 0;
}
Problem 7. Bishop Attack!!
#include<stdio.h>
int main(){
char str[2];//定义一个长度为2的char数组
int x1,y1,x2,y2,x3,y3;
scanf("%s",str);//读入一行中的两个字符,第一个字符是str[0],第二个字符是str[1]
y1=str[0]-'a'+1;
x1=str[1]-'0';
scanf("%s",str);//读入一行中的两个字符,第一个字符是str[0],第二个字符是str[1]
y2=str[0]-'a'+1;
x2=str[1]-'0';
scanf("%s",str);//读入一行中的两个字符,第一个字符是str[0],第二个字符是str[1]
y3=str[0]-'a'+1;
x3=str[1]-'0';
if((x2==8||x2==1)&&(y2==8||y2==1)&&(x3-x2==1||x3-x2==-1)&&(y3-y2==1||y3-y2==-1))puts("-1");//国王被堵在角落里
else if((x1==8||x1==1)&&(y1==8||y1==1)&&(x3-x1==1||x3-x1==-1)&&(y3-y1==1||y3-y1==-1))puts("-1");//主教被堵在角落里
else if((x1-x2==y1-y2)||(x1-x2==y2-y1)){//主教和国王是否在同一斜线上
if((x1-x3==y1-y3)||(x1-x3==y3-y1)){//士兵和主教是否在同一斜线上
if(((x3>x1&&x3<x2)||(x3>x2&&x3<x1))&&((y3>y1&&y3<y2)||(y3>y1&&y3<y2)))puts("3");//士兵是否在主教和国王的位置之间
else puts("1");
}else puts("1");
}else if((x1+y1)%2==(x2+y2)%2)puts("2");//主教和国王是否在同色的格子上
else puts("-1");
return 0;
}
热身赛 Score Level:
#include<stdio.h>
int main()
{
int n,i,a=0,b=0,c=0,d=0,e=0;
scanf("%d",&n);
int score[n];
for(i=0;i<n;i++)
{ scanf("%d",&score[i]);}
for(i=0;i<n;i++)
{
if(score[i]>=90&&score[i]<=100)
a++;
else if(score[i]>=80&&score[i]<90)
b++;
else if(score[i]>=70&&score[i]<80)
c++;
else if(score[i]>=60&&score[i]<70)
d++;
else if(score[i]<60)
e++;
}
printf("A=%d\n",a);
printf("B=%d\n",b);
printf("C=%d\n",c);
printf("D=%d\n",d);
printf("E=%d\n",e);
return 0;
}
热身赛 Bishop Attack!(Easy Version):
#include <stdio.h>
int main() {
char str[2];
int x1,y1,x2,y2;
scanf("%s",str);
y1=str[0]-'a'+1;
x1=str[1]-'0';
scanf("%s",str);
y2=str[0]-'a'+1;
x2=str[1]-'0';
// printf("%d %d %d %d\n",x1,y1,x2,y2);
if((x1-x2==y1-y2)||(x1-x2==y2-y1))puts("1");
else if((x1%2==y1%2)==(x2%2==y2%2))puts("2");
else puts("-1");
return 0;
}