中国大学MOOC-翁恺-C语言-PAT习题及解答-第八周

08-0. 查找整数(10)

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);
如果没有找到,输出“Not Found”。

输入格式:输入在第1行中给出2个正整数N(<=20)和X,第2行给出N个整数。数字均不
超过长整型,其间以空格分隔。
输出格式:在一行中输出X的位置,或者“Not Found”。

输入样例1:5 7
3 5 7 1 9
输出样例1:2
输入样例2:5 7
3 5 8 1 9
输出样例2:Not Found

#include <stdio.h>

int main()
{
	int n,x;
	int flag = 1;
	printf("please input : ");
	scanf("%d %d", &n, &x);
	int arr[n];
	for(int i=0; i<n; i++){ 
		// int a;
		// scanf("%d", &a);
		// arr[i] = a;
		scanf("%d", &arr[i]);
	}
	for(int i=0; i<n; i++){
		if(arr[i] == x){
			flag = 0;
			printf("address : %d", i);
		}
	}
	if(flag) printf("Not Found");
	return 0;
}

08-1. 求一批整数中出现最多的个位数字(20)

给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、
2345、3456,其中出现最多次数的数字是3和4,均出现了3次。

输入格式:输入在第1行中给出正整数N(<=1000),在第2行中给出N个不超过整型范
围的正整数,数字间以空格分隔。
输出格式:在一行中按格式“M: n1 n2 …”输出,其中M是最大次数,n1、n2、……为出现
次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。

输入样例:3
1234 2345 3456
输出样例:3: 3 4

#include <stdio.h>

int main()
{
	int n,a;
	int s=0;	//计算共有多少个数字
	int arr[100];	//存放输入的整数拆分出来的个位数
	int number[10] = {0};	//索引即数,对应的值即为其个数

	printf("please input : ");
	scanf("%d", &n);
	for(int i=0; i<n; i++){
		scanf("%d", &a);
		while(a > 0){
			int tmp = a % 10;
			arr[s] = tmp;
			a /= 10;
			s++;
		}
	}

	for(int i=0; i<s; i++){
		// printf("%d === %d\n", i, arr[i]);
		number[arr[i]]++;
	}

	int max = -1;
	// int r = 0;
	// int res[10] = {0};
	for(int i=0; i<10; i++){
		// printf("%d --> %d\n", i, number[i]);
		if(number[i] > max) max = number[i];
	}
	// for(int i=0; i<10; i++){
	// 	if(number[i] == max){
	// 		res[r] = i;
	// 		r++;
		// }
	// }
	// printf("%d :", max);
	// for(int i=0; i<r; i++){
	// 	printf(" %d", res[i]);
	// }
	// // 将以上注释的两个for循环简写为以下一个for循环
	// // 直接判断索引值是否为最大数量max,是则输出其索引
	printf("%d :", max);
	for(int i=0; i<10; i++){
		if(number[i] == max){
			printf(" %d", i);
		}
	}

	return 0;
}
#include <stdio.h>
#include <string.h>

int a[1002];

int main()
{
	int t, i, max = 0;
	int count[10];
	scanf("%d", &t);
	for ( i=0; i<10; i++ )
	{
		count[i] = 0;
	}
	for ( i=0; i<t; i++ )
	{
		scanf("%d", &a[i]);
	}
	for ( i=0; i<t; i++ )
	{
		while (a[i])
		{
			count[a[i]%10]++;
			a[i] /= 10;
		}
	}
	for ( i=0; i<10; i++ )
	{
		if ( max < count[i] )
		{
			max = count[i];
		}
	}
	printf("%d:", max);
	for ( i=0; i<10; i++ )
	{
		if ( count[i] == max )
		{
			printf(" %d", i);
		}
	}
	printf("\n");
	
	return 0;
}

08-2. 求矩阵的局部极大值(15)

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称
元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:输入在第1行中给出矩阵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

#include <stdio.h>

int main()
{
	int m,n,flag=0;
	printf("please input : ");
	scanf("%d %d", &m, &n);
	int arr[m][n];
	for(int i=0; i<m; i++){
		for(int j=0; j<n; j++){
			scanf("%d", &arr[i][j]);
		}
	}
	printf("\nresult:\n");
	for(int i=1; i<m-1; i++){
		for(int j=1; j<n-1; j++){
			// printf("%d ", arr[i][j]);
			if(arr[i][j]>arr[i][j+1] && arr[i][j]>arr[i][j-1] && arr[i][j]>arr[i-1][j] && arr[i][j]>arr[i+1][j]){
				printf("%d %d %d\n", arr[i][j], i+1, j+1);
				flag = 1;
			}
		}
	}
	if(!flag){
		printf("None %d %d", m, n);
	}
	return 0;
}

08-3. 组个最小数 (20)

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数
尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是
10015558。现给定数字,请编写程序输出能够组成的最小的数。

输入格式:每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有
数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥
有1个非0的数字。
输出格式:在一行中输出能够组成的最小的数。

输入样例:2 2 0 0 0 3 0 0 1 0
输出样例:10015558

#include <stdio.h>

int main()
{
	int arr[10];
	for(int i=0; i<10; i++){
		scanf("%d", &arr[i]);
	}
	for(int i=1; i<9; i++){
		if(arr[i] != 0){
			printf("%d", i);
			arr[i] -= 1;
			break;
		}
	}
	for(int i=0; i<10; i++){
		for(int j=0; j<arr[i]; j++){
			printf("%d", i);
		}
	}


	// for(int i=0; i<10; i++){
	// 	scanf("%d", &arr[i]);
	// 	num[arr[i]]++;
	// }
	// for(int i=0; i<10; i++){
	// 	for(int j=0; j<num[i]; j++){
	// 		printf("%d", num[i]);
	// 	}
	// }
	return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hao难懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值