目录
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中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯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;}