13、5个数求最值
设计一个从5个整数中取最小数和最大数的程序
- 输入:输入只有一组测试数据,为五个不大于1万的正整数
- 输出:输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开。
思路
默认第一个元素为最大值和最小值。循环给数组赋值,然后循环做判断最最大最小。
具体实现
#include<stdio.h>
int main()
{
int max, min;
int num[5] = {};//定义一维数组大小为5并初始化
for (int i = 0; i < 5; i++) {//循环赋值给数组
scanf_s("%d", &num[i]);
}
max = num[0];//默认第一个为最大值
min = num[0];//默认第一个为最小值
for (int i = 0; i < 5; i++) {
if (min > num[i]) {
min = num[i];
}
if (max < num[i]) {
max = num[i];
}
}
printf("最大值和最小值为:%d %d", max,min);
return 0;
}
运行结果
复杂度
- 时间复杂度 O(n)--- 遍历数组比较元素大小,其中n为数组长度
- 空间复杂度 O(1)---数组是题目要求输入的数组,且只用到有限个,除此仅有常熟级的变量
14、ASCII码排序
输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。
- 输入: 第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格。
- 输出: 对于每组输入数据,输出一行,字符中间用一个空格分开。
思路
- 使用 if 语句进行条件判断,如果 a 大于 b,则借助于中间变量 temp 互换 a 与 b 值, 依此类推比较 a 与 c、b 与 c,最终结果即为 a、b、c 的升序排列。
- 使用输出函数将 a、b、c 的值依次输出。
具体实现
#include<stdio.h>
int main()
{
int num=0;//num表示有多少组测试数据
printf("输入测试几组数据\n");
scanf_s("%d\n", &num);
while (num--) {
char a, b, c, temp;
scanf_s(" %c %c %c", &a,1,&b,1,&c,1);//输入三个字符 利用空格避免第二次输入时候显示不全
if (a > b) {/*如果a大于b,借助中间变量temp实现a与b值的互换*/
temp = a;
a = b;
b = temp;
}
if (a > c) {
temp = a;
a = c;
c = temp;
}
if (b > c) {
temp = b;
b = c;
c = temp;
}
printf("小到大排序后:%c %c %c\n", a, b, c); /*输出函数顺序输出a、b、c的值*/
}
return 0;
}
运行结果
复杂度
- 时间复杂度O(1)---除去输入数据所占用的时间,剩下仅为常数级,while循环也是根据输入的数据定义循环多少次。
- 空间复杂度O(1)---仅有常熟级的变量,除此无额外的辅助空间
用C++实现
#include <iostream>
#include <string>
using namespace std;
//ASCII码排序
int main() {
int n = 0; // 一共测试n行数据
string str = ""; // 每行由三个字符构成,中间无空格,用字符串存储
char tmp = 0; // 中间变量
cin >> n; // 输入行数n
cin.get(); // 吸收掉回车 ??? 这步骤没有看的很懂?理解是将回车清楚,但是去除后,代码又报错。
while (n-- && getline(cin, str)) { // 输入数据,实现升序排列
if (str[0] > str[1]) tmp = str[0], str[0] = str[1], str[1] = tmp;
if (str[0] > str[2]) tmp = str[0], str[0] = str[2], str[2] = tmp;
if (str[1] > str[2]) tmp = str[1], str[1] = str[2], str[2] = tmp;
cout << "顺序为:" << str[0] << ' ' << str[1] << ' ' << str[2] << endl;
}
return 0;
}
C++代码复制大神的💪蓝蓝计算机考研算法-day09求5个数的最值和ASCII码排序 - 掘金 (juejin.cn)
疑问:
string str = ""; // 每行由三个字符构成,中间无空格,用字符串存储 ??? 可以用char 吗? cin.get(); // 吸收掉回车 ??? 这步骤没有看的很懂?理解是将回车清除,但是去除后,代码又报错。
小结
- 未给数组赋值前都没有num[0]
- 对于用C语言实现字符及字符串的输入输出,在VS2022上有很多未能解决的问题。
- 给数组赋值:
int a[5];
scanf("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]);
int num[5] = {};//定义一维数组大小为5并初始化
for (int i = 0; i < 5; i++) {//循环赋值给数组
scanf_s("%d", &num[i]); }
char a, b, c, temp;
scanf_s(" %c %c %c", &a,1,&b,1,&c,1);//输入三个字符 利用空格避免第二次输入时候显示不全
string str = ""; // 每行由三个字符构成,中间无空格,用字符串存储
cin.get(); // 吸收掉回车
getline(cin, str); // 输入数据