GESP C++ 二级拓展课(二)
课题及解析建议用时120分钟,
文字区只需要看懂,代码区需要自己敲,才更有效喔!
课题及解析:
1、4015:【GESP2309二级】小杨的X字矩阵
【题目描述】
小杨想要构造一个N×N 的 X 字矩阵(N 为奇数),这个矩阵的两条对角线都是半角加号 +
,其余都是半角减号-
。例如,一个 的 X 字矩阵如下:
+---+ -+-+- --+-- -+-+- +---+
请你帮小杨根据给定的 打印出对应的“X 字矩阵”。
【输入】
一行一个整数N (5≤N≤49 ,保证N为奇数)。
【输出】
输出对应的“X 字矩阵”。
请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。你应该恰好输出N 行,每行除了换行符外恰好包含N个字符,这些字符要么是 +
,要么是 -
。
【输入样例】
5
【输出样例】
+---+ -+-+- --+-- -+-+- +---+
【提示】
特别提醒:
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入 2
7
样例输出 2
+-----+ -+---+- --+-+-- ---+--- --+-+-- -+---+- +-----+
【解析】
思路:
①题意:输出一个行和列长度都是n的矩阵,坐上角(1,1)到右下角(n,n)的斜线上都是+,右上角(1,n)到左下角(n,1)的斜线上也都是+,其他位置上都是-。
②关键点:行的编号=列的编号 或 行的编号+列的编号=n+1 时输出'+',否则输出'-'。解题步骤:
①变量:
int n;
②一级结构:
for(int i=1; i<=n; i++)// i是行的编号
③二级结构(在一级结构里面):
for(int j=1; j<=n; j++)// j是列的编号
cout<<endl;
④三级结构(在二级结构里面):
if(i==j || i+j==n+1) cout<<'+';
else cout<<'-'
【答案】
#include<iostream>
using namespace std;
int main()
{int n;cin>>n;for(int i=1; i<=n; i++){// i是行的编号 for(int j=1; j<=n; j++){// j是列的编号 if(i==j || i+j==n+1){cout<<'+';} else{cout<<'-';} }cout<<endl;}return 0;
}
二、4043:【GESP2403二级】乘法问题
【题目描述】
小 A 最近刚刚学习了乘法,为了帮助他练习,我们给他若干个正整数,并要求他将这些数乘起来。
对于大部分题目,小 A 可以精准地算出答案,不过,如果这些数的乘积超过106 ,小 A 就不会做了。
请你写一个程序,告诉我们小 A 会如何作答。
【输入】
第一行一个整数n ,表示正整数的个数。
接下来n 行,每行一个整数a 。小 A 需要将所有的a 乘起来。
保证n≤50 ,a≤100 。
【输出】
输出一行,如果乘积超过106 ,则输出>1000000 ;否则输出所有数的乘积。
【输入样例】
2 3 5
【输出样例】
15
【提示】
样例输入 2
3 100 100 100
样例输出 2
1000000
样例输入 3
4 100 100 100 2
样例输出 3
>1000000
【解析】
思路:
①题意:第一行输入一个n,表示有n个数,第二行开始分别输入这n个数。然后把这n个数都乘起来,结果>1000000时,输出“>1000000”;结果不大于>1000000时,输出结果。
②关键点:可以用a表示输入的每个数,编号为:a1、a2、a3、······an,
如果a1+a2+a3+......+an大于1000000,输出“>1000000”;
否则,输出结果。
解题步骤:
①变量:
int n, a, ji=1;
cin>>n;
②一级结构:
for(int i=1; i<=n; i++)
③二级结构(在一级结构里):
cin>>a;
ji*=a;// ji每次循环都要*a,程序运行完后ji=1*a1*a2*a3*......an。
④一级结构运行完后要做判断:
if(ji>1000000) cout<<">1000000";
else cout<<ji;
【答案】
/*二、4043:【GESP2403二级】乘法问题*/
#include<iostream>
using namespace std;
int main()
{int n, a, ji=1;cin>>n;for(int i=1; i<=n; i++){cin>>a;ji*=a;// ji每次循环都要*a,程序运行完后ji=1*a1*a2*a3*......an。} if(ji>1000000) cout<<">1000000";else cout<<ji; return 0;
}
三、4027:【GESP2312二级】小杨做题
【题目描述】
为了准备考试,小杨每天都要做题。第 1 天,小杨做了a 道题;第 2 天,小杨做了b 道题;从第 3 天起,小杨每天做的题目数量是前两天的总和。
此外,小杨还规定,当自己某一天做了大于或等于m 题时,接下来的所有日子里,他就再也不做题了。
请问,到了第 天,小杨总共做了多少题呢?
【输入】
总共 4 行。第一行一个整数a ,第二行一个整数b ,第三行一个整数m ,第四行一个整数N 。
保证0≤a,b≤10 ;a,b<M≤1,000,000 ;3≤N≤364 。
【输出】
一行一个整数,表示小杨N 天里总共做了多少题目。
【输入样例】
1 2 10 5
【输出样例】
19
【提示】
样例解释 1
小杨第一天做1 题,第二天做2 题,第三天做1+2=3 题,第四天做2+3=5 题,第五天做3+5=8 题。因此他总共做了1+2+3+5+8=19 题。
样例输入 2
1 1 5 8
样例输出 2
12
样例解释 2
小杨前 5 天分别做了1,1,2,3,5 题,由于第 5 天小杨做了5 题,而m=5 ,于是小杨从此以后不再做题。因此小杨总共做了1+1+2+3+5=12 题。
【解析】
思路:
①题意:第一个做a题,第二天做b题,第三天做前两天的和道题,依次类推。当某一天做题大于或等于m道时,不管做没做满n天都停止做题。问n天一共做题数量的和。
②关键点:h初始为a+b,每次循环先把a和b右移一个位置,也就是b可以表示从第二个数开始的所有数,每次循环都把h加上b。如果循环中途,b>=m,就提前结束循环。解题步骤:
①变量:
int a, b, m, n;
cin>>a>>b>>m>>n;
int h=a+b;// 上一行输入了a和b后,才能把h初始为a+b;
int gjr;// 工具人变量,用于保存a原来的值。
②一级结构:
for(int i=1; i<=n; i++)
③二级结构(在一级结构里):
if(b>=m) break;
【答案】
/*4027:【GESP2312二级】小杨做题*/
#include<iostream>
using namespace std;
int main()
{int a, b, m, n;cin>>a>>b>>m>>n;int h=a+b; for(int i=1; i<=n; i++){int gjr=a;a=b;b=gjr+b;h+=b;if(b>=m){break;}}cout<<h;return 0;
}
四、4028:【GESP2312二级】小杨的 H 字矩阵
【题目描述】
小杨想要构造一个N×N 的 H 字矩阵(N 为奇数),具体来说,这个矩阵共有N 行,每行N 个字符,其中最左列、最右列都是 | ,而中间一行(即第N+12 行)的第2∼N−1 个字符都是 − ,其余所有字符都是半角小写字母a 。例如,一个N=5 的 H 字矩阵如下:
|aaa| |aaa| |---| |aaa| |aaa|
请你帮小杨根据给定的N 打印出对应的“H 字矩阵”。
【输入】
一行一个整数N (≤N≤49,保证N 为奇数)。
【输出】
输出对应的“H 字矩阵”。
请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。你应该恰好输出N 行,每行除了换行符
外恰好包含N 个字符,这些字符要么是 − ,要么是 | ,要么是 a 。你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。
【输入样例】
5
【输出样例】
|aaa| |aaa| |---| |aaa| |aaa|
【提示】
样例输入 2
7
样例输出 2
|aaaaa| |aaaaa| |aaaaa| |-----| |aaaaa| |aaaaa| |aaaaa|
【解析】
思路:
①题意:输出一个行和列长度都是n的矩阵,n是奇数。每行的第一列和最后一列都是|,中间一行(行==(n+1)/2时)都是-,其他位置上都是a。
②关键点:本题|的优先级比-高。解题步骤:
1.变量
int n;
cin>>n;
2.一级结构:
for(int h=1; h<=n; h++)// h为行的编号
3.二级结构:
for(int l=1; l<=n; l++)// l为列的编号
4.三级结构:
if(l==1 || l==n) cout<<"|";
else if( h==(n+1)/2 ) cout<<"-";
else cout<<"a";
【答案】
#include<iostream>
using namespace std;
int main()
{int n;cin>>n;for(int h=1; h<=n; h++){for(int l=1; l<=n; l++){if(l==1 || l==n) cout<<"|";else if(h==(n+1)/2) cout<<"-";else cout<<"a"; }cout<<endl;} return 0;
}