精选循环数组例题

本文题解大部分采用C++,如果部分题目需要Java等 可从评论里说一声。

目录

一、连续整数相加

二、 数组的左方区域

三、ABC排序

四、平方矩阵Ⅰ

五、平方矩阵 Ⅱ

六、彩票摇奖


一、连续整数相加

读入两个整数值 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;
}

六、彩票摇奖

为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:

  1. 每张彩票上印有 77 个各不相同的号码,且这些号码的取值范围为 1\sim331∼33。
  2. 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
  3. 共设置 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;
}

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值