💪蓝蓝计算机考研算法-day13学生成绩和阶乘求和

205 阅读3分钟

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,在按要求输出

运行实例

image.png

思路一


题目一,关键在于采用自定义结构体的形式存储数据,用一个自定的结构体表示一个学生的信息,其他的按要求输入输出即可。

思路二


题目二让我们解决一个阶乘求合的问题,大多数人的第一想法应该是递归求解或者嵌套双层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;
}
  • 时间复杂度 O(n)O(n) ---不考虑输入数据所占用的空间,仅需遍历一遍学生数组,其中n为所输入的学生信息的个数。
  • 空间复杂度 O(n)O(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;
}
  • 时间复杂度 O(1)O(1) ---所占用时间仅常数级
  • 空间复杂度 O(1)O(1)--- 仅常数级变量,无额外的辅助空间

总结

今天的题目涉及到了新的知识点-自定义结构体,除此还是强调,“定式思维”固然可以帮助我们快速解题,但是如果是为了追求更优的解题方法的话,还是需要更多的思考!!!(🧐)