1. 数组顺序查找
⭐ 语法题
#include<stdio.h>
int main()
{
int n,x,i;
int a[102];
scanf("%d", &n);
for (i = 0; i < n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &x);
int idx = -1;//记录x的最大下标
int max = 0;// 记录大于x的数
int min = 0;// 记录小于x的数
for (i = 0; i < n; i++)//从前往后遍历数组
{
int t = a[i];
if (t == x)
idx = i;
if (t > x)
max++;
if (t < x)
min++;
}
printf("%d\n%d\n%d\n", idx, max, min);
return 0;
}
2. 数组指定位置插入和删除
⭐ 细节输出(注意数组有效元素个数)
#include<stdio.h>
int main()
{
int x1,n1,n2,i;
int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
scanf("%d %d", &x1, &n1);
scanf("%d", &n2);
//原数组输出
for (i = 0; i < 10; i++)
printf("%5d", a[i]);
printf("\n");
//插值,输出
if (n1 < 0 || n1 > 10){
n1 = 10;
}
//要插入x的位置 后边的所有元素 往后挪一位,腾出空间给 x
for (i = 10; i > n1; i--){
a[i] = a[i - 1];
}
a[n1] = x1;//插入 x1
for (i = 0; i < 11; i++)
printf("%5d", a[i]);
printf("\n");
//删除,输出
if (n2 > 10 || n2 < 0)//删除的位置不合法
{
n2 = 0;//改为删除第一个元素
}
//删除的元素位置 后边的元素 都往前挪一位 覆盖前边的就ok了
for (i = n2; i < 10; i++)
a[i] = a[i + 1];
for (i = 0; i < 10; i++)
printf("%5d", a[i]);
printf("\n");
return 0;
}
3. 数组元素修改
⭐ 统一输出
#include<stdio.h>
int main()
{
int r,c;
int a[20] = { 81, 55, 102, 84, 204, 105, 56, 85, 58, 202, 101, 83, 104, 103, 82, 201, 59, 203, 57, 205 };
for (r = 0; r < 4; r++)//枚举行
{
for (c = 0; c < 5; c++)//枚举列
{
int idx = r * 5 + c;//数组下标
int score = a[idx];//分数
if (score < 60)
score = -1;
else if (score > 100 && score <= 200)
score = -2;
else if (score > 200)
score = -3;
printf("%5d", score);
}
printf("\n");//记得换行
}
return 0;
}
4. 字符个数统计
⭐ 数组下标映射:字符 --> ASCII 值 --> 数组下标
🤬 局部数组无默认值(记得初始化就好)
#include<stdio.h>
int main()
{
char a[100];
int i;
for (i = 0; i < 100; i++)//记得初始化数组,不然就是随机值啦
a[i] = ' ';
int cnt[256];//cnt 数组记录字母出现的次数,ASCII码值 0 - 256 覆盖大部分字符
for (i = 65; i < 130; i++)//初始计数数组
cnt[i] = 0;
scanf("%s", a);
for (i = 0; i <= 80; i++)
{
char c = a[i];
cnt[c]++;
}
for (i = 97; i <= 122; i++){
int num = cnt[i] + cnt[i - 32];
if (num)// 非0即真
printf("%c is %d\n", i, num);
}
return 0;
}
5. 数组元素共享
⭐ 从两边往中间找,不符合要求就交换
#include <stdio.h>
#include <math.h>
int IsPrimer(int num){
int i, flag = 0;
for (i = 2; i <= num / 2; i++){
if (num%i == 0)
break;
}
if (i>num / 2)
flag = 1;
return flag;
}
int main(){
int a[100], n, i, j, temp;
scanf("%d", &n);
for (i = 0; i<n; i++)
scanf("%d", &a[i]);
i = 0, j = n - 1;
while (i<j){
//【1】//请在此填入多行语句
while (!IsPrimer(a[i]))//从左往右找,找到第一个 素数 的下标i
i++;
while (IsPrimer(a[j]))//从右往左找,找到第一个 和数 的下标j
j--;
if (i < j)//交换
{
/* 临时变量交换
temp = a[i];
a[i] = a[j];
a[j] = temp;
*/
// 异或交换
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
}
for (i = 0; i<n; i++)
printf("%5d", a[i]);
return 0;
}
6. 找两个数组中共同元素值问题
⭐ 先枚举已有数组的元素,再枚举输入数组的元素,相同就输出
⭐ 已有数组的元素不重复,可以间接实现去重
#include <stdio.h>
int main()
{
int n, i, j, s1[10] = { 10, 21, 34, 12, 15, 8, 17, 20, 23, 30 }, s2[10];
scanf("%d", &n);
for (i = 0; i<n; i++)
scanf("%d", &s2[i]);
//【1】//请在此填入多行语句
for (i = 0; i < 10; i++)//枚举已有数组的元素
for (j = 0; j < n; j++)//枚举输入数组的元素
if (s1[i] == s2[j]){
printf("%5d", s2[j]);
break;
}
return 0;
}
7. 数组循环右移k个位置
⭐ 一步一步来右移就好啦
#include <stdio.h>
int main(){
int a[100], n, k, i, j;
int tmp;
scanf("%d", &k);
scanf("%d", &n);
for (i = 0; i<n; i++)
scanf("%d", &a[i]);
//【1】//请在此填入多行语句
while (k--)//向右移动 k 次,每次移动 1 位
{
tmp = a[n - 1];
for (i = n-1; i > 0; i--){
a[i] = a[i - 1];
}
a[0] = tmp;
}
for (i = 0; i<n; i++)
printf("%3d", a[i]);
return 0;
}
8. 数组逆序保存
⭐ 逆序输出就好啦
for (i = n-1; i >= 0; i--)
printf("%3d", a[i]);
⭐ 非得折腾一下的话
#include <stdio.h>
int main(){
int a[100], n, i, tmp;
scanf("%d", &n);
for (i = 0; i<n; i++)
a[i] = 2 * i + 1;
for (i = 0; i<n; i++)
printf("%3d", a[i]);
printf("\n");
//【1】//请在此填入多行代码
for (i = 0; i + i < n; i++){//第1 和 倒1 交换,第2 和 倒2 交换……
tmp = a[i];
a[i] = a[n - 1 - i];
a[n - 1 - i] = tmp;
}
for (i = 0; i<n; i++)
printf("%3d", a[i]);
return 0;
}