目录
7-1 数组元素循环右移问题(20分)
输入格式:
输出格式:
输入样例:
输出样例:
代码
7-2 找出不是两个数组共有的元素(20分)
输入格式:
输出格式:
输入样例:
输出样例:
代码
7-3 方阵循环右移(20分)
输入格式:
输出格式:
输入样例:
输出样例:
代码
7-4 求一批整数中出现最多的个位数字(20分)
输入格式:
输出格式:
输入样例:
输出样例:
7-5 判断上三角矩阵(15分)
输入格式:
输出格式:
输入样例:
输出样例:
代码
7-6 数字加密(15分)
输入格式:
输出格式:
输入样例:
输出样例:
代码
7-7 求矩阵的局部极大值(15分)
输入格式:
输出格式:
输入样例1:
输出样例1:
输入样例2:
输出样例2:
代码
7-8 组个最小数(20分)
输入格式:
输出格式:
输入样例:
输出样例:
代码
7-1 数组元素循环右移问题(20分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
编译器:GCC
代码
#include <stdio.h>
int main()
{int n = 0;//存储待接收的整数序列的元素个数int m = 0;//存储右移的步数int arr[100] = { 0 };//存储待接收的整数序列int i = 0;//循环变量int j = 0;//循环变量,表示循环中已经右移的步数int temp = 0;//临时变量,用于帮助各元素数据的移动scanf("%d %d", &n,&m);for (i=0;i<n;i++){scanf("%d",&arr[i]);}for (j = 0; j < m; j++) //每一轮循环实现右移一个位置,总共进行m轮循环,即右移m个位置{//实现右移一个位置temp = arr[n - 1];for (i = n - 2; i >= 0; i--){arr[i + 1] = arr[i];}arr[0] = temp;}for (i = 0; i < n; i++)//设置循环打印数组前n个元素{ //并设置判断语句进行判断,除了最后一个元素后面没空格,前面每个元素后面都有空格printf("%d", arr[i]);if (i<n-1){printf(" ");}}return 0;
}
7-2 找出不是两个数组共有的元素(20分)
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
输入样例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例:
3 5 -15 6 4 1
编译器:GCC
代码
#include <stdio.h>int main()
{// 目标数组 int a1[20] = { 0 };// 目标数组int a2[20] = { 0 };// 临时数组int a3[20] = { 0 };// 分别表示两个数组的长度(元素个数)int n, m;// 先输入的表示 a1 的长度,然后输入目标数组 a1 的每个元素scanf("%d", &n);for (int i = 0; i < n; i++){scanf("%d", &a1[i]);}// 先输入的表示 a2 的长度,然后输入目标数组 a2 的每个元素scanf("%d", &m);for (int i = 0; i < m; i++){scanf("%d", &a2[i]);}// k 为临时数组的索引int k = 0;for (int i = 0; i < n; i++){// flag表示假设当前元素在另一个数组中不出现int flag = 1;for (int j = 0; j < m; j++){// 如果找到相同的元素,就将 flag 置为 0 ,假设不成立if (a1[i] == a2[j]){flag = 0;}}// 如果假设成功,就将当前元素放入临时数组if (flag) a3[k ++] = a1[i];}for (int i = 0; i < m; i++){int flag = 1;for (int j = 0; j < n; j++){if (a2[i] == a1[j]){flag = 0;}}if (flag) a3[k++] = a2[i];}// 打印临时数组的数据,重复的只打印一次for (int i = 0; i < k; i++){int flag = 1;// 向前寻找看有没有相同元素for (int j = 0; j < i; j++){// 有就将 flag 置为 0 ,后面的 if 就不进去 if (a3[i] == a3[j]){flag = 0;}}// 如果 flag 为 1 ,说明当前的元素没有重复,进入 ifif (flag){// 控制输入格式,题目会检查if (!i){// 如果是第一个元素就不打印空格printf("%d", a3[i]);}else{// 将空格往前打印,因为最后不能有空格printf(" %d", a3[i]);}}}return 0;
}
7-3 方阵循环右移(20分)
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
编译器:GCC
代码
#include <stdio.h>int main()
{int m, n, i, j, k, l;int det[6][6] = { 0 }, temp[6][6] = { 0 };scanf("%d %d", &m, &n);for (i = 0; i < n; i++)for (j = 0; j < n; j++)scanf("%d", &det[i][j]);//存入数据for (i = 0; i < m; i++)//右移m次{for (j = 0; j < n; j++)for (k = 0; k < n; k++)//三重循环,一次判断处理数据{if (k != n - 1)temp[j][k + 1] = det[j][k];elsetemp[j][0] = det[j][k];//数据从最后一列换到第一列}//将数据右移后存入temp数组中for (l = 0; l < n; l++)for (j = 0; j < n; j++)det[l][j] = temp[l][j];//逐个将temp中的数据复制到det中,为下次循环准备}for (i = 0; i < n; i++){for (j = 0; j < n; j++)printf("%d ", det[i][j]);printf("\n");//行循环结束换行}return 0;
}
7-4 求一批整数中出现最多的个位数字(20分)
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入格式:
输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。
输出格式:
在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。
输入样例:
3
1234 2345 3456
输出样例:
3: 3 4
编译器:GCC
#include<stdio.h>
int main()
{int n,i,max;int a[10]={0};scanf("%d",&n);for(i=1;i<=n;i++)//计算各个各位数字出现的次数{int c;scanf("%d",&c);int number=10;int b;do{b=c%number;c=c/number;a[b]++;}while(c>0);}i=1;max=a[0];while(i<10)//求最大次数{ max=max>a[i]?max:a[i];i++;}printf("%d:",max);for(i=0;i<10;i++)if(max==a[i])printf(" %d",i);return 0;
}
7-5 判断上三角矩阵(15分)
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
输入样例:
3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6
输出样例:
YES
NO
NO
编译器:GCC
代码
#include<stdio.h>
int main()
{int T; // 待测矩阵的个数int matrix[10][10]; // 方阵scanf("%d", &T);for (int n = 1; n <= T; n++) // 依次判断T个方阵是否是上三角矩阵{int m; // m阶方阵scanf("%d", &m);for (int i = 0; i < m; i++) //输入数据{for (int j = 0; j < m; j++){scanf("%d", &matrix[i][j]);}}int flag = 1; // 标志性变量,为1表示该方阵为上三角矩阵// 判断其是否是上三角矩阵// 上三角矩阵的特点:主对角线下方全为0// 主对角线下方元素特点:行号大于列号for (int i = 0; i < m; i++){for (int j = 0; j < m; j++){if (j >= i) // 列号大于等于行号,继续{continue;}if (matrix[i][j] != 0) // 主对角线下方但凡有一个元素不为0,则其不是上三角矩阵{flag = 0;}}}if (flag == 1) // 本次判断的矩阵为上三角矩阵{printf("YES\n");}else{printf("NO\n"); // 非上三角矩阵}}return 0;
}
7-6 数字加密(15分)
输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。
输入格式:
输入在一行中给出一个四位的整数x,即要求被加密的数。
输出格式:
在一行中按照格式“The encrypted number is V”输出加密后得到的新数V。
输入样例:
1257
输出样例:
The encrypted number is 4601
编译器:GCC
代码
#include <stdio.h>
int main(void)
{int n,i,num[4]={},nums=1;scanf("%d", &n);for (i=1;i<4;i++){nums=nums*10;num[i]=(n/nums)%10;}num[0]=n%10;int j,k;for(j=0;j<4;j++){num[j]+=9;num[j]=num[j]%10;}k=num[3];num[3]=num[1];num[1]=k; //实现交换 k=num[2];num[2]=num[0];num[0]=k;printf("The encrypted number is %d%d%d%d", num[3], num[2], num[1], num[0]);return 0;
}
7-7 求矩阵的局部极大值(15分)
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。
输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。
输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2:
None 3 5
编译器:GCC
代码
#include<stdio.h>
int main()
{int m,n;scanf("%d %d",&m,&n);int i,j;int a[m][n];for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);}}int flag;for(i=1;i<m-1;i++) //注意本体边界,由于局部最大值首先需要有上线左右四个值包围,因此在设置范围的时候需要将上下左右去掉一行一列{flag=1;for(j=1;j<n-1;j++){if((a[i][j]>a[i-1][j])&&(a[i][j]>a[i+1][j])&&(a[i][j]>a[i][j-1])&&(a[i][j]>a[i][j+1])){printf("%d %d %d\n",a[i][j],i+1,j+1);flag=0; //本题通过flag == 0进行判断是否出现局部最大值 }}}if(flag==1){printf("None %d %d",m,n);}return 0;}
7-8 组个最小数(20分)
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
编译器:GCC
代码
#include<stdio.h>int main() {// 存储数字 0~9 对应的个数int numberCounts[10];for (int i = 0; i < 10; i++) {scanf("%d", &numberCounts[i]);}// 根据 numberCounts 中存储的各位数字个数初始化 digits 数组int digits[50];int index = 0;for (int i = 0; i < 10; i++) {for (int j = 1; j <= numberCounts[i]; j++, index++) {digits[index] = i;}}// 如果第一个数字为 0,则将其与第一个非 0 数字交换位置if (digits[0] == 0) {// 从剩下的数字中找到第一个非 0 数字并与 digits[0] 交换for (int i = 1; i < index; i++) {if (digits[i] != 0) {int temp = digits[0];digits[0] = digits[i];digits[i] = temp;break;}}}for (int k = 0; k < index; k++) {printf("%d", digits[k]);}return 0;
}