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;
}
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;
}
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 . 求鞍点
⭐ 鞍点:是指该位置上的元素值在该行上最大、在该列上最小。
#include<stdio.h>
int main()
{
int a[7][7];
int max[7], min[7];//max 记录第 i 行的最大值,min记录第 j 列的最小值
int i, j, n;
for(i = 0; i < 7; i++)
{
max[i] = -1e9;
min[i] = 1e9;
}
scanf("%d", &n);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
if(a[i][j] > max[i])
max[i] = a[i][j];
if(a[i][j] < min[j])
min[j] = a[i][j];
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(a[i][j] == max[i] && a[i][j] == min[j])
{
printf("a(%d,%d)=%d", i, j, a[i][j]);
return 0;
}
}
}
printf("NO");
return 0;
}
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 + 1 == count)//输出完有效数字后直接结束程序(数组下标从 0 开始,判断时得 +1 )
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;
}
程序片段编程题
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]