GESP C++ 二级拓展课 三
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
样例输出 2
>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;
}
4044:【GESP2403二级】小杨的日字矩阵
【题目描述】
小杨想要构造一个N×N 的日字矩阵(N 为奇数),具体来说,这个矩阵共有N 行,每行N 个字符,其中最左列、最右列都是 | ,而第一行、最后一行、以及中间一行(即第N+12 行)的第2∼N−1 个字符都是− ,其余所有字符都是半角小写字母 x 。例如,一个N=5 的日字矩阵如下:
|---|
|xxx|
|---|
|xxx|
|---|
请你帮小杨根据给定的N 打印出对应的“日字矩阵”。
【输入】
一行一个整数 N(5≤N≤49 ,保证 为奇数)。
【输出】
输出对应的“日字矩阵”。
请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。你应该恰好输出N 行,每行除了换行符外恰好包含N 个字符,这些字符要么是 − ,要么是 | ,要么是 x 。你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。
【输入样例】
5
【输出样例】
|---|
|xxx|
|---|
|xxx|
|---|
【提示】
样例输入 2
7
样例输出 2
|-----|
|xxxxx|
|xxxxx|
|-----|
|xxxxx|
|xxxxx|
|-----|
【解析】
思路:
题意:一个n行n列的矩阵,列==1或列==n的位置是|;行==1或行==n或行==(n+1)/2的位置是-,其他行都是x。列的优先级比行高,如第一行第一列,满足|也满足-时,为|。解题步骤:
1、变量:
int n;
cin>>n;
2、一级结构:
for(int h=1; h<=n; h++){}
3、二级结构(在一级结构里):
for(int l=1; l<=n; l++){}
cout<<endl;
4、三级结构(在二级结构里):
if(l==1 || l==n){}
else{}
5、四级结构(在三级结构中的else里):
if(h==1 || h==n || h==(n+1)/2){}
else{}
【答案】
/*4044:【GESP2403二级】小杨的日字矩阵*/
#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==1 || h==n || h==(n+1)/2){cout<<'-';}else{cout<<'x';}} }cout<<endl;}return 0;
}
4059:【GESP2406二级】平方之和
【题目描述】
小杨有n 个正整数a1,a2,...,an ,他想知道对于所有的i (1≤i≤n ),是否存在两个正整数x 和y 满足x×x+y×y=ai。
【输入】
第一行包含一个正整数n ,代表正整数数量。
之后n 行,每行包含一个正整数,代表ai 。
【输出】
对于每个正整数ai ,如果存在两个正整数x 和y 满足x×x+y×y=ai ,输出 Yes
,否则输出 No
。
【输入样例】
2
5
4
【输出样例】
Yes
No
【提示】
样例解释
对于第一个正整数,存在1×1+2×2=5 ,因此答案为Yes
。
数据范围
对于全部数据,保证有1≤n≤10,1≤ai≤106 。
【解析】
思路:
1、题意:先输入一个n,再输入n个数,当输入的n个数中有可以分解成两个正整数的平方和时(x*x+y*y),输出Yes,否则输出No。解题步骤:
1、变量:
int n, a, x, y;
cin>>n;
2、一级结构:
for(int i=1; i<=n; i++)
3、二级结构(写在一级结构里):
cin>>a;bool fbfh=false;
for(x=1; x*x<a; x++)
if(fbfh) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
4、三级结构(写在二级结构里):
for(y=1; y*y<a; y++)
5、四级结构(写在三级结构里):
if(x*x+y*y==a) fbfh=true;
【答案】
/*4059:【GESP2406二级】平方之和*/
#include<iostream>
using namespace std;
int main()
{int n, a, x, y;cin>>n;for(int i=1; i<=n; i++){cin>>a;bool fbfh=false;for(x=1; x*x<a; x++){for(y=1; y*y<a; y++){if(x*x+y*y==a){fbfh=true;} }}if(fbfh) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}
4060:【GESP2406二级】计数
【题目描述】
小杨认为自己的幸运数是正整数 k(注:保证1≤k≤9 )。小杨想知道,对于从1 到n 的所有正整数中, 出现了多少次。
【输入】
第一行包含一个正整数n 。
第二行包含一个正整数k 。
【输出】
输出从1 到n 的所有正整数中,k 出现的次数。
【输入样例】
25
2
【输出样例】
9
【提示】
样例解释
从1 到25 中, 2出现的正整数有2,12,20,21,22,23,24,25 ,一共出现了9 次。
数据范围
对于全部数据,保证有1≤n≤1000,1≤k≤9 。
【解析】
一、思路:
1、题意:求1到n(1<=n<=1000)的所有正整数中,k(1<=k<=9)出现了多少次?二、解题步骤:
1、变量:
int n, k, h=0;
cin>>n>>k;
2、一级结构:
for(int i=1; i<=n; i++){}
cout<<h;
3、二级结构(写在一级结构里):
int a=i;
while(a){}
4、三级结构(写在二级结构里):
if(a%10==k) h++;
a=a/10;
【答案】
#include<iostream>
using namespace std;
int main()
{int n, k, h=0;cin>>n>>k;for(int i=1; i<=n; i++){int a=i;while(a){if(a%10==k) h++; a=a/10; }}cout<<h; return 0;
}