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

219 阅读2分钟

17、学生成绩

现有若干个学生(不超过100的数据记录),每个记录包括学号姓名,三科成绩,学号不超过15位,且有字母。成绩为整数,每个学生的姓名不超过10个字母,且是包含字母,读入n条记录,再按要求输出。

  • 输入:学生数量N占一行,每个学生的学号、姓名、三科成绩占一行,空格分开。
  • 输出:每个学生的学号、姓名、三科成绩占一行,逗号分开。

示例

输入样例

2

a111 zhblue 70 80 90

b111 newsclan 90 85 75

输出样例

a111,zhblue,70 ,80,90

b111,newsclan,90,85,75

说明:2代表2个学生数据,其他输入依次为学号,姓名,成绩1,2,3,在按要求输出

思路

法一:与题不符合是想:利用定义将变量定义出来,利用“逗号”替换“空格思路”,在输出的时候进行替换。 实现的是输入一行后立即输出一行,与题目不符合。 法二:采用结构体来定义变量

具体实现(与题不符)

#include<stdio.h>
int main()
{
    char number[15], nume[10];//number代表学号,nume代表姓名
    int a, b, c;//a,b,c各代表三个成绩
    int num;//num代表有几条学生数据
    scanf_s("%d", &num);
    while (num--)//
    {
        scanf_s("%s", number,15);
        scanf_s("%s", nume, 10);
        scanf_s("%d %d %d", &a, &b, &c);
        printf("%s,%s,%d,%d,%d\n", number, nume, a, b, c);
    }
    return 0;
}

运行结果

image.png

复杂度

  • 时间复杂度O(1) ---所占用时间仅常数级
  • 空间复杂度O(1)--- 仅常数级变量,无额外的辅助空间

具体实现(与题相符)

#include<stdio.h>
#define MAX_STUDENT_NUM 100//学生数据量
typedef struct Student {
    char number[15], nume[10];//number代表学号,nume代表姓名
    int a = 0, b = 0, c = 0;//a,b,c各代表三个成绩
};
int main()
{
    struct Student stu[MAX_STUDENT_NUM];
    int num;//num代表有几条学生数据
    scanf_s("%d", &num);
    for (int i = 0; i < num; i++) {
       scanf_s("%s %s %d %d %d", &stu[i].number,15,&stu[i].nume,10, &stu[i].a, &stu[i].b, &stu[i].c);
    }
    for (int j = 0; j < num; j++) {
        printf("%s,%s,%d,%d,%d\n", stu[j].number, stu[j].nume, stu[j].a, stu[j].b, stu[j].c);
    }
    return 0;
}

运行结果

image.png

复杂度

  • 时间复杂度O(n) ---不考虑输入数据所占用的空间,仅需遍历一遍学生数组,其中n为所输入的学生信息的个数。
  • 空间复杂度O(n)--- 使用了一个辅助数组,用来记录所有的学生的信息,其中n为所输入的学生信息的个数。

18、求和

求和s=1!+2!+3!+...+10!(阶乘求和)

思路

法一:采用递归操作,通过展开阶乘,寻找阶乘递归规律,采用一层for循环求阶层,一层for循环求和。

法二:利用所求的阶乘是固定的自增变化,用for循环中循环变量更新的方式,使用一个单层for循环。

具体实现(法一)

//阶层和
#include<stdio.h>
int fun(int a) {
	if (a == 1) return 1;
	else {
		return a * fun(a - 1);//如3!=3*2*1
	}
}
int main() {
	int sum=0;
	for (int i = 1; i <= 10; i++) {
		sum += fun(i);//调用求阶乘函数累计和
	}
	printf("10阶乘和为:%d", sum);
	printf("\n");
	return 0;
}

运行结果

image.png

复杂度

  • 时间复杂度O(n^2) ---所占用时间为两个for循环
  • 空间复杂度O(1)--- 仅常数级变量,无额外的辅助空间

具体实现(法二)

#include<stdio.h>
//阶层和
int main() {
	int sum = 0, fact = 1;//sum是总和,fact阶乘结果
	for (int i = 1; i <= 10; i++) {// 计算1!+2!+……+10!
		fact *= i;//阶乘1*2*3...
		sum += fact;//累加结果0+1+2...
	}
	printf("1!+2!+……+10!=%d", sum);
	return 0;
}

image.png

复杂度

  • 时间复杂度O(1) ---所占用时间仅常数级
  • 空间复杂度O(1)--- 仅常数级变量,无额外的辅助空间

小结

  1. 对于多个不同类别数据的存放,可以采用结构体来存储,并通过结构体数组存放多个数据。
  2. 阶乘运用不熟练