前言
考察C++数组的使用,数组元素的查找、数组的插入、删除等
一、元素插入有序数组
【试题描述】
给你一个整数 y 和一个数列, 这个数列保证从小到大排列, 现要求将这个整数 y 插入到数
列中, 使新的数列仍然从小到大排列。
【输入要求】
第一行一个整数 y : 等待插入的数
第二行一个整数 n : 数列中数的个数
第三行 n 个整数(空格隔开)
【输出要求】
一行整数: 新的数列(空格隔开)
【输入样例】
2
4
1 3 4 5
【输出样例】
1 2 3 4 5
#include <bits/stdc++.h>
using namespace std;
int main() {
int y;
cin >> y; // 读取等待插入的数
int n;
cin >> n; // 读取数列中数的个数
int nums[n+1]; // 创建一个大小为n的数列
for (int i = 0; i < n; ++i) {
cin >> nums[i]; // 读取数列中的每个数
}
// 找到插入位置
int insertIndex = 0;
while (insertIndex < n && nums[insertIndex] < y) {
++insertIndex;
}
// 将数组元素从插入位置开始向后移动一个位置
for (int i = n; i > insertIndex; i--) {
nums[i] = nums[i - 1];
}
// 在找到的位置插入元素
nums[insertIndex]=y;
// 输出新的数列
for (int i = 0; i < n+1; ++i) {
if (i > 0) cout << ' ';
cout << nums[i];
}
return 0;
}
二、数组元素的删除
【试题描述】
在读入的包括 n 个整数的数组中查找, 是否有元素等于读入的X , 如果没有找到则输出
“no” , 如果找到则在数组中将这个数删除, 然后输出删除该元素后的新数组。 (如果数
组中有多个元素等于 X, 查找并删除第一个等于 X 的元素。 )
【输入要求】
包括三行 , 第一行有一个整数 n; 第二行有 n 个整数; 第三行有一个整数 X, 为要查
找的数。
【输出要求】
如果没有找到则输出“no” , 如果找到则在数组中将这个数删除, 然后输出删除该元素
后的新数组。
【输入样例 1】
5
1 2 3 4 5
3
【输出样例 1】
1 2 4 5
【输入样例 2】
5
1 9 6 4 7
3
【输出样例 2】
no
#include <bits/stdc++.h>
using namespace std;
int main() {
//n个数
int n;
cin >> n;
//数组
int nums[n];
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
int X;
cin >> X;
//是否找到X
int found = 0;
// 查找要删除的元素
for (int i = 0; i < n; i++) {
if (nums[i] == X) {
// 找到了,将后面的元素向前移动
for (int j = i; j < n - 1; ++j) {
nums[j] = nums[j + 1];
}
found = 1;
break;
}
}
// 输出结果
if (found==1) {
for (int i = 0; i < n-1; ++i) {
cout << nums[i] << " ";
}
} else {
cout << "no";
}
return 0;
}
三、小明排队做操迟到
【试题描述】
做操的时间到了, 小明在教室还在思考刚刚老师讲的一道题目, 当他想通这个题时, 同
学们都已经在操场上排好队了, 他赶快跑到操场上找到自己的班级队伍, 希望尽快找到以前
排队的位置, 准备做操, 小明记得应该排在学号为 x 的同学的后面。你能不能来帮帮小明呢?
【输入要求】
输入(两行) :
n x y(现在队伍的长度、 某同学的学号 x、 小明的学号)
n 个同学的学号(整数)
【输出要求】
n+1 个学号(小明加入队伍后队伍中的每个数据)
【输入样例】
4 23 83
12 23 33 31
【输出样例】
12 23 83 33 31
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, x, y; // n是队伍长度,x是某同学的学号,y是小明的学号
cin >> n >> x >> y;
int s[n + 1]; // 为队伍中的学号和小明分配内存
for (int i = 0; i < n; ++i) {
cin >> s[i];
}
int found = 0; // 标记是否找到了学号为x的同学
int pos = 0; // 学号为x的同学的位置
// 查找学号为x的同学
for (; pos < n; ++pos) {
if (s[pos] == x) {
found = 1;
break;
}
}
// 如果找到了,将后面的学号向后移动一位,并在正确的位置插入小明的学号
if (found==1) {
for (int i = n; i > pos; --i) {
s[i] = s[i - 1];
}
s[pos + 1] = y; // 插入小明的学号
} else {
// 如果没有找到,将小明的学号添加到末尾
s[n] = y;
}
// 输出新的队伍
for (int i = 0; i < n+1; ++i) {
cout << s[i] << " ";
}
return 0;
}
四、看电影
【试题描述】
全校组织看电影, 每个班级坐一列, 初一 5 班班主任老师发现前面有几个同学估计是觉
得电影没意思, 老是在讲话, 坐在最后的几个同学又离的太远, 被前排同学遮住了, 因此班
主任决定, 全班悄悄来一次大调换, 将所有学生倒过来排, 原来坐第一个的, 现在坐最后一
张位置, 原来坐第二个的, 现在坐最后第二张位置, 以此类推。
请你来帮帮初一 5 班的同学实现这样的调换。 (不允许使用数组反向输出)
【输入要求】
一行。 若干 个整数(n 个同学的学号, 是 9 位整数) 。
【输出要求】
输出调换后的学生的学号。
【输入样例】
348312356 834123458 312345845 134568901
【输出样例】
134568901 312345845 834123458 348312356
#include <bits/stdc++.h>
using namespace std;
int main() {
int m = 100; // 假设最多有100个学生
int s[m]; // 使用数组来存储学号
int count = 0; // 记录已经读取的学号数量
for(int i=0;i<m;i++){
cin>>s[i];
count++;
if(cin.get() == '\n'){
break;
}
}
// 使用数组来存储反向学号
int st[count];
int num=count;
for(int i=0;i<count;i++){
num=num-1;
st[num] =s[i];
}
// 反向输出学号
for (int i = 0 ; i <count; i++) {
cout << st[i] << " ";
}
return 0;
}
五、数字接力
【试题描述】
奶牛们在玩一个数字游戏,它们从一个整数开始,比如: 6593。将这个整数中的各位数
字全部取出,将他们相乘,得到一个新的整数,上面的例子就是 6593=810,然后继续做
下去,810=0 得到了一个个位数 0。
帮助奶牛完成这个游戏,读入一个数并计算出有游戏得到一个个位数的过程。
【输入要求】
一个整数 N(10<=n<= 2,000,000,000)。
【输出要求】
在单独的一行中按顺序输出游戏过程中产生的每一个数直到一个个位数结束。 相邻两数
之间要求严格用一个空格隔开, 最后一个数之后不能有空格。
【输入样例】
98886
【输出样例】
98886 27648 2688 768 336 54 20 0
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n; // 输入整数
int current = n;
//输出n
cout<< n << " ";
//当得到一个个位数时停止
while (current >9){
int product = 1;
//取出每个位上的数相乘
// while (current > 0) {
for(;current > 0; ){
product =product* (current % 10); // 取出最低位数字并相乘
current = current/10 ; // 去掉最低位数字
}
current=product;
// 输出游戏过程中产生的每一个数
cout<< product ;
if(product>9){
//相邻两数之间要求严格用一个空格隔开。
cout << " ";
}
}
return 0;
}