GDPU C语言 天码行空6
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的位置 后边的所有元素 往后挪一位,腾出空间给 xfor (i = 10; i > n1; i--){a[i] = a[i - 1];}a[n1] = x1;//插入 x1for (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]))//从左往右找,找到第一个 素数 的下标ii++;while (IsPrimer(a[j]))//从右往左找,找到第一个 和数 的下标jj--;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;
}