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
思路
具体实现
#include <stdio.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
#define MAX_ID_LEN 16
#define MAX_NAME_LEN 11
typedef struct {
char id[MAX_ID_LEN];
char name[MAX_NAME_LEN];
int score[3];
} Student;
int main() {
int n;
Student students[MAX_STUDENT_NUM];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s%s%d%d%d", students[i].id, students[i].name,
&students[i].score[0], &students[i].score[1], &students[i].score[2]);
}
printf("\n");
for (int i = 0; i < n; i++) {
printf("%s %s %d %d %d\n", students[i].id, students[i].name,
students[i].score[0], students[i].score[1], students[i].score[2]);
}
return 0;
}
18、求和
s=1!+2!+3!+···+10!
方法一
思路
常规思路,分别计算阶乘之后相加。
具体实现
#include <stdio.h>
int main() {
int i, j;
int sum = 0, factorial = 1;
for (i = 1; i <= 10; i++) {
factorial = 1;
for (j = 1; j <= i; j++) {
factorial *= j;
}
sum += factorial;
}
printf("1! + 2! + 3! + ... + 10! = %d\n", sum);
return 0;
}
方法二
思路
使用一个数组来分别存储每个数字的阶乘,再循环相加即可。时间复杂度从方法一的O()降低为O(n)。
具体实现
#include <stdio.h>
#define N 10
int main() {
int i;
int sum = 0;
int factorial[N+1]; // 存储阶乘的值
factorial[0] = 1; // 0! = 1
// 预处理所有数字的阶乘,处理的同时进行求和
for (i = 1; i <= N; i++) {
factorial[i] = factorial[i-1] * i;
sum += factorial[i];
}
printf("1! + 2! + 3! + ... + 10! = %d\n", sum);
return 0;
}
小结
今天的算法不难,第一题使用了结构体,很纯粹的结构体用法。第二题主要是惯性思维直接就使用了双重循环来进行计算,方法二使用了利用数组来存储阶乘的数字,一边阶乘,一边进行求和运算,虽有一点额外空间使用,但是降低了时间复杂度。