Day13 2023/03/13
难度:简单
题目1
现有若干个学生(不超过100的数据记景,每个记录包括学号姓名,三科成绩,学号不超过15位,且有字母。成绩为整数,每名学生的姓名不超过10个字母,且只包含字母,读入条记录,再按要求输出
- 输入:学生数量n占一行每个学生的学号、姓名、三科成绩占一行,空格分开。
- 输出:每个学生的学号、姓名、三科成绩占一行,逗号分开。
题目2
求和s=1!+2!+3!++10!(阶乘求和)
示例
输入:1
c666 zxl 100 100 100
输出:c666,zxl,100,100,100
说明:1代表1个学生数据,其他输入依次为学号,姓名,成绩1,2,3,在按要求输出
运行实例
思路一
题目一,关键在于采用自定义结构体的形式存储数据,用一个自定的结构体表示一个学生的信息,其他的按要求输入输出即可。
思路二
题目二让我们解决一个阶乘求合的问题,大多数人的第一想法应该是递归求解或者嵌套双层for循环(外层控制累加,内层控制阶乘),但是仔细分析题目,会发现这个问题的数据是固定的,求和就到10的阶乘且所求的阶乘序列是按自增的顺序,所以无论是采用递归还是双层for循环,都显得有些不值当了,所占用的时间和空间都不是最优且代码不够简洁!
- 本题我仅采用一个单层for循环就ok了。(代码实现不难,仔细看看代码注释就ok了,这里主要是对题目数据的分析)
关键点
- 学过面向对象思想的同学,应该很好理解自定义结构体,就类似一个对象,题目一所给的学生信息,显然可以合并为一个对象(c++中自然可以使用自定义结构题来实现)
- 题目2,之所以可以使用单层for循环实现的依据是,我发现了所求数据中的阶乘序列是按照自增变化的,和for循环中循环变量更新的方式一样。
算法实现
c++代码实现-学生成绩
#include <iostream>
#include <string>
using namespace std;
//定义学生结构体
struct Student {
string id; // 学号
string name; // 姓名
int score1, score2, score3; //三科分数
Student(string id_val, string name_val, int s1, int s2, int s3)
: id(id_val), name(name_val), score1(s1), score2(s2),
score3(s3){}; //构造函数
};
// 学生成绩
int main() {
int n = 0, s1 = 0, s2 = 0, s3 = 0, i = 0; // 输入n组学生信息,s1,2,3为三门成绩
string id = "", name = ""; // 学号 姓名
Student *students[100]; // 全部学生信息
cin >> n;
while (n-- && cin >> id >> name >> s1 >> s2 >> s3) {
Student *s = new Student(id, name, s1, s2, s3); // 创建一个新的学生信息并初始化
students[i++] = s; // 将一个学生信息放入学生数组中
}
cout << "输出:" << endl;
for (auto it : students) {
if(!it) break; // 如果信息为空,就跳出
cout << it->id << ',' << it->name << ',' << it->score1 << ',' << it->score2
<< ',' << it->score3 << endl; //按要求打印信息
}
return 0;
}
- 时间复杂度 ---不考虑输入数据所占用的空间,仅需遍历一遍学生数组,其中n为所输入的学生信息的个数。
- 空间复杂度 --- 使用了一个辅助数组,用来记录所有的学生的信息,其中n为所输入的学生信息的个数。
c++代码实现-阶乘求和
int main() {
int sum = 0, fact = 1; // 分别表示总和结果和阶乘
for (int i = 1; i <= 10; i++) { // 计算1!+2!+……+10!
fact*=i; // 阶乘
sum += fact; //累加结果
}
cout <<"计算结果为:"<< sum;
return 0;
}
- 时间复杂度 ---所占用时间仅常数级
- 空间复杂度 --- 仅常数级变量,无额外的辅助空间
总结
今天的题目涉及到了新的知识点-自定义结构体,除此还是强调,“定式思维”固然可以帮助我们快速解题,但是如果是为了追求更优的解题方法的话,还是需要更多的思考!!!(🧐)