本文题解大部分采用C++,如果部分题目需要Java等 可从评论里说一声。
目录
一、连续整数相加
读入两个整数值 a和 n,计算从 a 开始的 n个连续整数的和。
注意,如果读入的 n为 0 或负数,则继续读取数字直至读入 n 值为正整数为止。
输入格式
共一行,包含整数 a和若干个整数 n(不超过 100 个)。
输出格式
一个整数,表示从a开始的 n个连续整数的和。
数据范围
1≤ a ≤100
−100≤ n ≤100
输入样例1:
3 2
输出样例1:
7
输入样例2:
3 -1 0 -2 2
输出样例2:
7
解析:
疑难点:①n本身的数量不确定,怎么正确输入
如何解决:①采用循环while输入
#include<iostream>
using namespace std;
int main(){
int a,n;
cin>>a;
while(cin>>n, n<=0); //只要n<=0,就继续输入
int s=0;
for(int i=0; i<n; i++) s+=a+i;
cout<<s<<endl;
return 0;
}
易错点:n是a后面的个数,for循环那里任意写成如下
int s=0;
for(int i=a; i<n; i++) s+=i;
二、 数组的左方区域
输入一个二维数组 M[12][12],根据输入的要求,求出二维数组的左方区域元素的平均值或元素的和。
数组的两条对角线将数组分为了上下左右四个部分,如下图所示,黄色部分为对角线,绿色部分为左方区域:
输入格式
第一行输入一个大写字母,若为 S
,则表示需要求出左方区域的元素的和,若为 M
,则表示需要求出左方区域的元素的平均值。
接下来 12行,每行包含 12 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1行的第 j+1个数表示数组元素 M[i][j]。
输出格式
输出一个数,表示所求的平均数或和的值,保留一位小数。
数据范围
−100.0≤ M[i][j] ≤100.0
输入样例:
S
4.7 -3.3 -2.3 4.5 -7.0 8.7 -4.1 -3.0 -7.6 6.3 -6.6 -4.7
-7.2 9.3 -7.6 9.1 9.2 9.0 5.5 -7.5 -9.3 -1.6 -3.5 -4.2
0.5 -7.5 -8.3 -9.0 -6.4 3.8 0.1 -3.5 7.9 2.1 2.4 -6.2
7.0 5.7 -9.0 -5.8 1.6 2.6 -9.2 -6.2 4.6 8.2 -8.3 -1.4
3.8 -9.9 6.2 -2.5 -3.5 9.4 1.6 7.0 3.3 -0.5 6.7 6.0
1.6 -3.8 5.0 8.8 4.2 7.7 0.7 7.4 7.9 -5.9 4.4 3.3
3.7 6.2 6.7 -1.4 6.1 -6.0 8.5 9.1 5.7 -4.2 5.9 -3.5
5.0 0.3 2.2 -3.6 6.3 -10.0 9.5 -4.7 2.7 8.1 7.5 -8.4
-5.7 -0.3 -3.7 -3.3 7.7 9.3 -1.3 1.0 0.3 1.9 9.9 9.0
-7.4 1.3 -9.6 -3.6 2.2 3.4 -3.6 3.5 8.3 0.5 9.7 -6.8
1.0 -2.7 -1.5 5.4 -6.5 -3.7 5.6 8.0 -9.9 0.1 2.2 7.6
5.6 4.3 1.5 -0.8 5.8 -5.1 5.5 6.2 -5.8 8.8 -0.6 -2.3
输出样例:
13.3
解析:
疑难点:①如何找到左方区域
如何解决:①找到对应规律
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
char t;
cin>>t;
double q[12][12];
for(int i=0; i<12; i++){
for(int j=0; j<12; j++){
cin>>q[i][j];
}
}
double s=0,c=0;
for(int i=0;i<=5;i++){
for(int j=0; j<=i-1; j++)
{
s+=q[i][j];
c+=1;
}
}
for(int i=6;i<=10;i++){
for(int j=0; j<=10-i; j++)
{
s+=q[i][j];
c+=1;
}
}
if(t=='S') cout<<s;
else cout<<fixed<<setprecision(1)<<s/c<<endl;
return 0;
}
三、ABC排序
传入参数行和列实现下列操作, 注意ABC的排列顺序(按行排列)
解析:
疑难点:①如何边换行 边控制顺序输出ABC
import java.util.Scanner;
public class eg3 {
public static void abc(int m, int n) //m为行,n为列
{
int cnt = 1; //控制ABC输出顺序
for (int i = 0; i < m; i++) { //行
int j=0;
while(j<n) { //列
for(int h=0; h<3; h++){
cnt=cnt % 3;
if(cnt==1)
{
System.out.print(" A ");
j++;
}
if(cnt==2)
{
System.out.print(" B ");
j++;
}if(cnt==0)
{
System.out.print(" C ");
j++;
}
if(j==n) break;
cnt++;
}
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
abc(m, n);
}
}
四、平方矩阵Ⅰ
输入整数 N,输出一个 N 阶的回字形二维数组。
数组的最外层为 1,次外层为 2,以此类推。
输入格式
输入包含多行,每行包含一个整数 N。
当输入行为 N=0时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数 N,输出一个满足要求的 N 阶二维数组。
每个数组占 N 行,每行包含 N 个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
数据范围
0≤N≤100
输入样例:
1
2
3
4
5
0
输出样例:
1
1 1
1 1
1 1 1
1 2 1
1 1 1
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
解析:
思路:
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n,n)
{
for(int i=1; i<=n; i++) //枚举行
{
for(int j= 1; j<=n; j++) //枚举列
{
int up=i, down=n-i+1, left=j, right=n-j+1;
cout<< min(min(up,down), min(left,right)) <<" ";
}
cout<<endl;
}
cout<<endl;
}
}
五、平方矩阵 Ⅱ
输入整数 N,输出一个 N 阶的二维数组。
数组的形式参照样例。
输入格式
输入包含多行,每行包含一个整数 N。
当输入行为 N=0 时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数 N,输出一个满足要求的 N阶二维数组。
每个数组占 N 行,每行包含 N 个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
数据范围
0≤N≤100
输入样例:
1
2
3
4
5
0
输出样例:
1
1 2
2 1
1 2 3
2 1 2
3 2 1
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1
1 2 3 4 5
2 1 2 3 4
3 2 1 2 3
4 3 2 1 2
5 4 3 2 1
解析:
依旧要先找规律
#include<iostream>
using namespace std;
int q[100][100];
int main(){
int n;
while(cin>>n, n)
{
for(int i=0; i<n; i++)
{
q[i][i]=1; //先填对角线上的数
for(int j=i+1, k=2; j<n; j++,k++) q[i][j]=k; //填行
for(int j=i+1, k=2; j<n; j++,k++) q[j][i]=k; //填列
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++) cout<<q[i][j]<<' ';
cout<<endl;
}
}
cout<<endl;
return 0;
}
六、彩票摇奖
为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:
- 每张彩票上印有 77 个各不相同的号码,且这些号码的取值范围为 1\sim331∼33。
- 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
- 共设置 77 个奖项,特等奖和一等奖至六等奖。
兑奖规则如下:
- 特等奖:要求彩票上 7 个号码都出现在中奖号码中。
- 一等奖:要求彩票上有 6个号码出现在中奖号码中。
- 二等奖:要求彩票上有 5个号码出现在中奖号码中。
- 三等奖:要求彩票上有 4 个号码出现在中奖号码中。
- 四等奖:要求彩票上有 3 个号码出现在中奖号码中。
- 五等奖:要求彩票上有 2 个号码出现在中奖号码中。
- 六等奖:要求彩票上有 1 个号码出现在中奖号码中。
注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。例如,中奖号码为 23\ 31\ 1\ 14\ 19\ 17\ 18,则彩票 12\ 8\ 9\ 23\ 1\ 16\ 7 由于其中有两个号码(23 和 11)出现在中奖号码中,所以该彩票中了五等奖。
现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。
输入格式
输入的第一行只有一个自然数 n,表示小明买的彩票张数;
第二行存放了 7 个介于 1 和 33 之间的自然数,表示中奖号码;
在随后的 n行中每行都有 7个介于 1 和 33 之间的自然数,分别表示小明所买的 n张彩票。
输出格式
依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。
输入样例
2
23 31 1 14 19 17 18
12 8 9 23 1 16 7
11 7 10 21 2 9 31
输出样例
0 0 0 0 0 1 1
解析:
注意这种标记的思想。
这题无法用暴力拆解,不然会超时。
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
int n,a,b,c[34],d[8];
//a数组代表小明彩票号码,b数组代表中奖号码,d数组代表中N等奖个数
int main()
{
cin>>n;
for(int i=1;i<=7;i++) //号码有7个
{
cin>>b; //输入中奖彩票号码
c[b]=1;
}
for(int i=1;i<=n;i++) //小明买了n张彩票
{
int sx=0;
for(int j=1;j<=7;j++)
{
cin>>a; //输入小明彩票号码
if(c[a]==1)sx++;
}
d[7-sx+1]++; //中7-sx+1等奖的计数器+1
}
for(int i=1;i<=7;i++)
{
cout<<d[i]<<" ";
}
return 0;
}