【PTA|期末复习|编程题】数组相关编程题(一)

目录

7-1 乘法口诀数列 (20分)

输入格式:

输出格式:

输入样例:

输出样例:

样例解释:

代码

7-2 矩阵列平移(20分)

输入格式:

输出格式:

输入样例:

输出样例:

代码

7-3 组合数的和(15分)

输入格式:

输出格式:

输入样例:

输出样例:

代码

7-4 求集合数据的均方差(15分)

输入格式:

输出格式:

输入样例 1:

输出样例 1:

输入样例 2:

输出样例 2:

代码

7-5 矩阵A乘以B(15分)

输入格式:

输出格式:

输入样例1:

输出样例1:

输入样例2:

输出样例2:

代码

7-6 点赞(20分)

输入格式:

输出格式:

输入样例:

输出样例:

代码

7-7 数组循环左移(20分)

输入格式:

输出格式:

输入样例:

输出样例:

代码

7-8 数列求和-加强版(20分)

输入格式:

输出格式:

输入样例:

输出样例:

代码


7-1 乘法口诀数列 (20分)

本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

输入格式:

输入在一行中给出 3 个整数,依次为 a1​、a2​ 和 n,满足 0≤a1​,a2​≤9,0<n≤103。

输出格式:

在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

2 3 10

输出样例:

2 3 6 1 8 6 8 4 8 4

样例解释:

数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。

编译器:GCC

代码

#include<stdio.h>
int main()
{
    int a1 = 0;
    int a2 = 0;
    int n = 0;
    scanf("%d %d %d", &a1, &a2, &n);
    int arr[1000] = { 0 };
    arr[0] = a1;
    arr[1] = a2;
    int i = 0;
    int mul = 0;
    int count = 2;
 
    for (i = 0; i < n; i++)
    {
        mul = arr[i] * arr[i + 1];
        if (mul > 9)
        {
            arr[count++] = mul / 10;
            arr[count++] = mul % 10;
        }
        else
        {
            arr[count++] = mul;
        }
 
        if (count == n)
        {
            break;
        }
    }
 
    printf("%d", a1);
    for (i = 1; i < n; i++)
    {
        printf(" %d", arr[i]);
    }
 
    return 0;
}

7-2 矩阵列平移(20分)

给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的偶数列的元素整体向下依次平移 1、……、k、1、……、k、…… 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一行元素的和。

输入格式:

输入第一行给出 3 个正整数:n(<100)、k(<n)、x(<100),分别如题面所述。

接下来 n 行,每行给出 n 个不超过 100 的正整数,为矩阵元素的值。数字间以空格分隔。

输出格式:

在一行中输出平移后第 1 到 n 行元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

7 2 99
11 87 23 67 20 75 89
37 94 27 91 63 50 11
44 38 50 26 40 26 24
73 85 63 28 62 18 68
15 83 27 97 88 25 43
23 78 98 20 30 81 99
77 36 48 59 25 34 22

输出样例:

440 399 369 421 302 386 428

样例解读

需要平移的是第 2、4、6 列。给定 k=2,应该将这三列顺次整体向下平移 1、2、1 位(如果有更多列,就应该按照 1、2、1、2 …… 这个规律顺次向下平移),顶端的空位用 99 来填充。平移后的矩阵变成:

11 99 23 99 20 99 89
37 87 27 99 63 75 11
44 94 50 67 40 50 24
73 38 63 91 62 26 68
15 85 27 26 88 18 43
23 83 98 28 30 25 99
77 78 48 97 25 81 22

编译器:GCC

代码

#include<stdio.h>
 
int main()
{
    int n,k,x;
    scanf("%d %d %d",&n,&k,&x);
    int a[n][n];
    int f=1;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    for(int j=1;j<n;j+=2)
    {
        for(int i=n-1;i>=f;i--)
        {
            a[i][j] = a[i-f][j];
        }
        for(int i=0;i<f;i++)
        {
            a[i][j] = x;
        }
        f = f%k+1;
    }
    for(int i=0;i<n;i++)
    {
        int sum = 0;
        for(int j=0;j<n;j++)
        {
            sum += a[i][j];
        }
        if(i==0) printf("%d",sum);
        else printf(" %d",sum);
    }
    return 0;
}

7-3 组合数的和(15分)

给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。

输入格式:

输入在一行中先给出 N(1 < N < 10),随后一行给出 N 个不同的非 0 个位数字。数字间以空格分隔。

输出格式:

输出所有可能组合出来的2位数字的和。

输入样例:

3
2 8 5

输出样例:

330

编译器:GCC

代码

#include<stdio.h>
int main()
{
    int m,sum=0,s[10];
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d",&s[i]);
        sum+=s[i]*(m-1)*10+s[i]*(m-1);
    }
    printf("%d",sum);
    return 0;
}

7-4 求集合数据的均方差(15分)

设计函数求 N 个给定整数的均方差。若将 N 个数 A[ ] 的平均值记为 Avg,

输入格式:

输入首先在第一行给出一个正整数 N(≤104),随后一行给出 N 个正整数。所有数字都不超过 1000,同行数字以空格分隔。

输出格式:

输出这N个数的均方差,要求固定精度输出小数点后5位。

输入样例 1:

10
6 3 7 1 4 8 2 9 11 5

输出样例 1:

3.03974

输入样例 2:

1
2

输出样例 2:

0.00000

编译器:GCC

代码

# include<stdio.h>
# include<math.h>
int main()
{
	int A[10000],m,i,j,sum=0;
	double x,y1=0,y2=0;
	scanf("%d",&m);
	for(i=0;i<m;i++)
	{
		scanf("%d",&A[i]);
		 sum+=A[i];
	}
	x=sum*1.0/m;
	for(i=0;i<m;i++)
	{
		y1+=(A[i]-x)*(A[i]-x);
	}
	y2=sqrt(y1/m);
	printf("%0.5lf",y2);
	return 0; 
	
}

7-5 矩阵A乘以B(15分)

给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。

输入格式:

输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:

若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

输出样例1:

2 4
20 22 24 16
53 58 63 28

输入样例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72

输出样例2:

Error: 2 != 3

编译器:GCC

代码

#include<stdio.h>
int main()
{
    int row1 = 0;
    int col1 = 0;
    scanf("%d %d", &row1, &col1);
    int arr1[100][100] = { 0 };
    int i = 0;
    //输入第一个矩阵
    for (i = 0; i < row1; i++)
    {
        int j = 0;
        for (j = 0; j < col1; j++)
        {
            scanf("%d", &arr1[i][j]);
        }
    }
 
    int row2 = 0;
    int col2 = 0;
    scanf("%d %d", &row2, &col2);
    int arr2[100][100] = { 0 };
    //输入第二个矩阵
    for (i = 0; i < row2; i++)
    {
        int j = 0;
        for (j = 0; j < col2; j++)
        {
            scanf("%d", &arr2[i][j]);
        }
    }
    //判断
    if (col1 != row2)
    {
        printf("Error: %d != %d", col1, row2);
    }
    else
    {
        //输出乘积矩阵
        printf("%d %d\n",row1,col2);
        for (i = 0; i < row1; i++)
        {
            int j = 0;
            for (j = 0; j < col2; j++)
            {
                int sum = 0;
                int k = 0;
                for (k = 0; k < row2; k++)
                {
                    sum += arr1[i][k] * arr2[k][j];
                }
                printf("%d", sum);
                if (j != col2 - 1)
                {
                    printf(" ");
                }
                else
                {
                    printf("\n");
                }
            }
        }
    }
    return 0;

}

7-6 点赞(20分)

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。

输入格式:

输入在第一行给出一个正整数N(≤1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F1​⋯FK​”,其中1≤K≤10,Fi​(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔。

输出格式:

统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。

输入样例:

4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123

输出样例:

233 3

编译器:GCC

代码

#include <stdio.h>
int main(){
    int i,j,k,N,K,F,max=0,cha[1001]={0};
    scanf("%d",&N);
    for(i=0;i<N;i++){
        scanf("%d",&K);
        for(j=0;j<K;j++){
            scanf("%d",&F);
            cha[F]++;
            if(cha[F]>cha[max]){
                max=F;
            }
            if(cha[F]==cha[max]&&F>max){
                max=F;
            }
        }
    }
    printf("%d %d",max,cha[max]);
    return 0;

}

 

7-7 数组循环左移(20分)

本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0​a1​⋯an−1​)变换为(am​⋯an−1​a0​a1​⋯am−1​)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

8 3
1 2 3 4 5 6 7 8

输出样例:

4 5 6 7 8 1 2 3

编译器:GCC

代码

#include<stdio.h>
int main(){
	int i,n,j;
	int k;
	scanf("%d",&n);
	int m;
	scanf("%d",&m);
	int a[n];
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<m;i++){//每次移动一位,一共移动m次
		k=a[0];//保存第一位的值
	  for(j=0;j<n-1;j++){
	  	a[j]=a[j+1];//数组向左移动
	  	
	  }	
	a[n-1]=k;	//让最后一位等于原本的第一位的值
	}
	
	for(i=0;i<n-1;i++){
		printf("%d ",a[i]);
	}
	printf("%d",a[n-1]);//结尾没有空格
	
	return 0;

7-8 数列求和-加强版(20分)

给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。

输入格式:

输入数字A与非负整数N。

输出格式:

输出其N项数列之和S的值。

输入样例:

1 3

输出样例:

123

编译器:GCC

代码

#include <stdio.h>

int main() {
int result[100000]={0};//存放结果的每一位
int a=0,n=0;
scanf("%d %d",&a,&n);
int i=n;
int flag=0;
int cnt=0;//控制存放结果的位数:从低位开始存 
if(n==0)
printf("%d",0);
else
{
	for(;i>=1;i--)
	{
         int temp=i*a+flag;
		result[cnt++]=temp%10;
		flag=temp/10;
	}
	//输出结果:从高位开始输出 
	if(flag!=0)//要注意高位 
	result[cnt++]=flag; 
	i=cnt-1;
	for(;i>=0;i--)
	{
		printf("%d",result[i]);
	}
}
    return 0;

}

  • 37
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值