GDPU C语言 天码行空7 数组

🍑 C语言实验专栏 (代码可免登录复制)


1. 数组最大值交换

在这里插入图片描述
⭐ 1e9:10的9次方

#include<stdio.h>

int main()
{
	int n, i,idx = 0;//idx 记录第一个出现的最大值下标
	scanf("%d", &n);
	double a[30];
	double max = -1e9;// 1e9 表示10的9次方,十亿,int 的最大范围级别
	for (i = 0; i < n; i++)
	{
		scanf("%lf", &a[i]);
		if (a[i] > max)
		{
			idx = i;
			max = a[i];
		}
	}
	int tmp = a[0];
	a[0] = a[idx];
	a[idx] = tmp;

	for (i = 0; i < n; i++)
		printf("%lf  ", a[i]);

	return 0;
}

2. 统计数字字符个数

在这里插入图片描述
⭐ 0 的 ACSCII值是 48

#include<stdio.h>

int main()
{
	int cnt = 0;
	char c;
	int flag = 0;//出现是否第一个 # 

	while (1)//写个死循环
	{
		scanf("%c", &c);
		if (c == '#')
		{
			if (flag)
				break;//两个 # 结束
			flag = 1;
		}
		else
		{
			flag = 0;//清掉第一个 #
			if (c >= '0' && c <= '9')
				cnt++;
		}
	}
	printf("sum=%d", cnt);
	return 0;
}

3 . 求鞍点

在这里插入图片描述

⭐ 鞍点:是指该位置上的元素值在该行上最大、在该列上最小。

👨‍🏫 代码 by RY

#include <stdio.h>
#include <limits.h> // 用于INT_MIN和INT_MAX


int main() {
    int n,i,j;
    scanf("%d", &n);

    int a[n][n]; 
    int rMax[n], cMin[n]; // 用于存储每行的最大值和每列的最小值
    
    for ( i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }


    // 初始化rowMax和colMin
    for ( i = 0; i < n; i++) {
        rMax[i] = INT_MIN;
        cMin[i] = INT_MAX;
    }

    // 找出每行的最大值和每列的最小值
    for ( i = 0; i < n; i++) {
        for ( j = 0; j < n; j++) {
            if (a[i][j] > rMax[i]) {
                rMax[i] = a[i][j];
            }
            if (a[i][j] < cMin[j]) {
                cMin[j] = a[i][j];
            }
        }
    }


    // 检查每个元素是否为鞍点
    int Found = 0; // 标记是否找到鞍点
    for ( i = 0; i < n; i++) {
        for ( j = 0; j < n; j++) {
            if (a[i][j] == rMax[i] && a[i][j] == cMin[j]) {
                printf("a(%d,%d)=%d", i , j , a[i][j]);
                Found = 1;
            }
        }
    }


    if (!Found) {
        printf("NO");//找不到无返回值
    }


    return 0;
}

输入1

3
12 34 23
34 78 20
10 21 45

输出1

NO

输入2

3
20 34 35
11 30 29
32 45 50

输出2

a(1,1)=30

4. 二维数组删除指定值的元素

在这里插入图片描述
⭐ 师说:不能改原来代码,好啊
① 先看变量,只要 count 计数
② 填代码处【1】: a[i][j] != num 表示有效值(未删),说明 count 记录的是有效值
③ 填代码处【2】:按行输出,输出个数小于 count 即可

#include <stdio.h>

int main(){

	int i, j, count = 0, num;

	int a[5][5] = { { 1, 2, 3, 4, 5 }, { 2, 3, 4, 5, 6 }, { 3, 4, 5, 6, 7 }, { 0, 1, 2, 3, 4 }, { 6, 7, 8, 9, 0 } };

	scanf("%d", &num);

	for(i = 0; i<5; i++)
		for(j = 0; j<5; j++)
			if(a[i][j] != num){
		//【1】//请填入一行或多行代码
				a[count/5][count%5] = a[i][j];
				count++;//count记录有效值个数
			}
			

	for(i = 0; i<5; i++){//输出
		//【2】//请填入一行或多行代码
		for(j = 0; j < 5; j++)
		{
			if(i * 5 + j  == count)//输出完有效数字后直接结束程序
				return 0;
			printf("%3d", a[i][j]);
		}

		printf("\n");
	}
	return 0;
}

5. 小猴修仙

在这里插入图片描述

⭐ 特判滑到地面的情况即可

#include <stdio.h>

int main() {
	int k, n,i;
	scanf("%d%d", &k, &n);
	int h = 0;//记录小猴现在的高度
	for(i = 0; i < n; i++) {
		int m, p;
		scanf("%d%d", &m, &p);
		h += m;//白天 上爬
		if(h >= k)//只要爬到了 k 就成功了,收工 
		{
			printf("YES\n");
			return 0;
		}
		h -= p;//晚上 下滑
		if(h < 0)//最次就是滑倒地面,不存在打入地府
			h = 0;
	}
	printf("NO\n");
	return 0;
}

❌错误案例❌

#include <stdio.h>
//未处理边界
int main()
{
 int k,n,m,p,i;
 scanf("%d %d",&k,&n);
 for(i=0;i<n;i++)
 {  
  scanf("%d %d",&m,&p); 
  if(k-m<=0)
  {
   printf("YES");
   return 0; 
  } 
  k=k-m+p; 
 }
 printf("NO");   
 return 0; 
}

❌❌❌❌❌❌
在这里插入图片描述

6. 围圈报数

在这里插入图片描述
⭐ 状态数组:记录每一位同学是否 有旗帜
⭐ 循环:取模就好,特判一下 n

#include<stdio.h>

int main()
{
	int n, m, i,j;
	scanf("%d %d", &n, &m);
	char w[10]= { '1', 'l', 'e', 'v', 'e', 'l', '1' };
	char st[1000];//状态数组,表示每个学生的状态
	for (i = 0; i < 1000; i++)
		st[i] = 'x';//初始化位 x 表示无旗

	int idx = 0;//表示当前报数的同学的数组下标
	for (i = 0; i < 7; i++){// i 表示的是第 i 面旗帜
		for (j = 1; j <= m; j++){// j 枚举报数的值,枚举到n
			idx++;
			while (st[idx%n] != 'x')//非 x 表示已有旗出列啦
				idx++;//跳过这位同学
		}
		if (idx == n)// n % n == 0; 特殊处理一下 第 n 位同学的情况
			st[idx] = w[i];
		else
			st[idx%n] = w[i];

	}

	for (i = 1; i <= n; i++){
		if (st[i] != 'x')
			printf("%d %c\n", i, st[i]);
	}

	return 0;
}

程序片段编程题

1. 回文数组

在这里插入图片描述
在这里插入图片描述
🤠 碰撞双指针 + (代码规范)
😋 ans 记录结果,left right 表示作用向中间移动的下标(指针),flag 记录是否有解


⭐ 代码片段1
🐷 方式1:简单粗暴,出结果直接结束程序(OI 首选)

printf("%d", ans);
return 0;

🐷 方式2:统一结果(结果统一在最后输出,flag记录是否有解)(便于后期维护调试)

flag = 1;
break;

⭐ 代码片段2
🐷 合并了就跳过 1 个就好啦

a[left + 1] += a[left];
left++;
ans++;

2. 判断回文数

在这里插入图片描述


🤠 代码片段1
⭐ 每次取出 x 的最低位

a[i++] = x%10

🤠 代码片段2
⭐ 数组的起点是 0,终点是 i-1, p是从两端向中间的偏移量

a[0 + p] != a[i-1 - p]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值