点击进入学习

请勿使用fgets,尽量使用gets
每次我用fgets都会半对半错,去掉/n也没用
相同的东西使用gets就是对的

仅供自己学习
其他学生看到此页请勿抄写,仅供参考学习
其他学生看到此页请勿抄写,仅供参考学习
其他学生看到此页请勿抄写,仅供参考学习

先修课-2024-1

最好的文档

有一位软件工程师说过一句很有道理的话:“Good code is its own best documentation.”(好代码本身就是最好的文档)。本题就请你直接在屏幕上输出这句话。
输入格式:
本题没有输入。
输出格式:
在一行中输出 Good code is its own best documentation.。
输入样例:

输出样例:
Good code is its own best documentation.

1
2
3
4
5
#include<stdio.h>
int main(){
printf("Good code is its own best documentation.");
return 0;
}

自动编程

输出语句是每个程序员首先要掌握的语句。Python 的输出语句很简单,只要写一个 print(X) 即可,其中 X 是需要输出的内容。
本题就请你写一个自动编程机,对任何一个要输出的整数 N,给出输出这个整数的 Python 语句。
输入格式:
输入给出一个不超过 100000 的正整数。
输出格式:
在一行中打印输出这个整数的 Python 语句,其中不包含任何空格。
输入样例:
520
输出样例:
print(520)

1
2
3
4
5
6
7
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("print(%d)",a);
return 0;
}

什么是机器学习

面试官:9 + 10 等于多少?
答:3
面试官:差远了,是19。
答:16
面试官:错了,是19。
答:18
面试官:不,是19。
答:19

本题就请你模仿这个“机器学习程序”的行为
输入格式:
输入在一行中给出两个整数,绝对值都不超过 100,中间用一个空格分开,分别表示面试官给出的两个数字 A 和 B
输出格式:
要求你输出 4 行,每行一个数字。第 1 行比正确结果少 16,第 2 行少 3,第 3 行少 1,最后一行才输出 A+B 的正确结果

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(){
int a,b,sum;
scanf("%d%d",&a,&b);
sum=a+b;
printf("%d\n",sum-16);
printf("%d\n",sum-3);
printf("%d\n",sum-1);
printf("%d\n",sum);
return 0;
}

先修课-2024-2

是不是太胖了

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)
输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。
输入样例:
169
输出样例:
124.2
与MOOC的题如出一辙,记得转换进制

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main() {
int height;
float standard_weight;
scanf("%d", &height);
standard_weight = 2*(height - 100) * 0.9;
printf("%.1f\n", standard_weight);
return 0;
}

计算存款利息

本题目要求计算存款利息,计算公式为interest=money×(1+rate) ^year −money
其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。
输入格式:
输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。
输出格式:
在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。
输入样例:
1000 3 0.025
输出样例:
interest = 76.89

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <math.h>
int main() {
double money, year, rate, interest;
scanf("%lf %lf %lf", &money, &year, &rate);
interest = money * pow(1 + rate, year) - money;
printf("interest = %.2f\n", interest);
return 0;
}

pow的用法:

1
2
3
#include<math.h>

double pow(double base, double exponent);

base表示底数,exponent表示指数 输出值

计算摄氏温度

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出一个华氏温度。
输出格式:
在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。
输入样例:
150
输出样例:
Celsius = 65

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(){
int f,c;
scanf("%d",&f);
c=5*(f-32)/9;
printf("Celsius = %d",c);
return 0;
}

易错点:输出等号左右两边都有空格*

先修课-2024-3

程序员买包子

这是一条检测真正程序员的段子:假如你被家人要求下班顺路买十只包子,如果看到卖西瓜的,买一只。那么你会在什么情况下只买一只包子回家?
本题要求你考虑这个段子的通用版:假如你被要求下班顺路买 N 只包子,如果看到卖 X 的,买 M 只。那么如果你最后买了 K 只包子回家,说明你看到卖 X 的没有呢?
输入格式:
输入在一行中顺序给出题面中的 N、X、M、K,以空格分隔。其中 N、M 和 K 为不超过 1000 的正整数,X 是一个长度不超过 10 的、仅由小写英文字母组成的字符串。题目保证 N不等于M
输出格式:
在一行中输出结论,格式为:
如果 K=N,输出 mei you mai X de;
如果 K=M,输出 kan dao le mai X de;
否则输出 wang le zhao mai X de.
其中 X 是输入中给定的字符串 X。
输入样例 1:
10 xigua 1 10
输出样例 1:
mei you mai xigua de
输入样例 2:
10 huanggua 1 1
输出样例 2:
kan dao le mai huanggua de
输入样例 3:
10 shagua 1 250
输出样例 3:
wang le zhao mai shagua de

我题目都没读懂,管他呢,按他说的做就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
int N,M,K;
char X[10];
scanf("%d%s%d%d",&N,&X,&M,&K);
if (K==N)
printf("mei you mai %s de",X);
else if (K==M)
printf("kan dao le mai %s de",X);
else
printf("wang le zhao mai %s de",X);
return 0;
}

新胖子公式

根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。
输入格式:
输入在一行中给出两个正数,依次为一个人的体重(以 kg 为单位)和身高(以 m 为单位),其间以空格分隔。其中体重不超过 1000 kg,身高不超过 3.0 m。
输出格式:
首先输出将该人的体重和身高代入肥胖公式的计算结果,保留小数点后 1 位。如果这个数值大于 25,就在第二行输出 PANG,否则输出 Hai Xing。
输入样例 1:
100.1 1.74
输出样例 1:
33.1
PANG
输入样例 2:
65 1.70
输出样例 2:
22.5
Hai Xing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
double kg,m;
double result;
scanf("%lf%lf",&kg,&m);
result=kg/m/m;
printf("%.1lf\n",result);
if (result>25)
printf("PANG");
else
printf("Hai Xing");
return 0;
}

真的恭喜你

输入格式:
输入在一行里给出一位小朋友的分数。这个分数是一个 0 到 100 之间的整数。
输出格式:
在一行中输出你对这位小朋友说的话。如果人家考到不低于 90 分,就说 gong xi ni kao le X fen!;如果不到 90 分,就说 kao le X fen bie xie qi!。其中 X 是小朋友输入的分数。
输入样例 1:
95
输出样例 1:
gong xi ni kao le 95 fen!
输入样例 2:
89
输出样例 2:
kao le 89 fen bie xie qi!

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main() {
int x;
scanf("%d", &x);
if (x >= 90)
printf("gong xi ni kao le %d fen!", x);
else
printf("kao le %d fen bie xie qi!", x);
return 0;
}

判断一个三位数是否为水仙花数

本题要求编写程序,判断一个给定的三位数是否为水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。
输入格式:
输入在一行中给出一个需要判断的整数 N(100≤N≤999)。
输出格式:
如果N是水仙花数,则在一行中输出Yes,否则输出No。如果N不是三位数,则输出Invalid Value.。
输入样例1:
153
输出样例1:
Yes
输入样例2:
500
输出样例2:
No
输入样例3:
-2
输出样例3:
Invalid Value.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main() {
int N;
int a,b,c;
scanf("%d", &N);
a=N/100;
b=(N%100)/10;
c=N%10;
if (a==0 || N/1000 !=0)
printf("Invalid Value.\n");
else if (a*a*a+b*b*b+c*c*c==N)
printf("Yes\n");
else
printf("No\n");
return 0;
}

成绩转换

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:
输入在一行中给出一个整数的百分制成绩。
输出格式:
在一行中输出对应的五分制成绩。
输入样例:
90
输出样例:
A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main() {
int score;
char ch;
scanf("%d", &score);

if (score >= 90) {
ch = 'A';
}
else if (score >= 80) {
ch = 'B';
}
else if (score >= 70) {
ch = 'C';
}
else if (score >= 60) {
ch = 'D';
}
else {
ch = 'E';
}
printf("%c\n", ch);
return 0;
}

五级制成绩

任务描述
五级制成绩表示法可以这样来理解,A代表[90-100]、B代表[80-90)、C代表[70-80)、D代表[60-70)、E代表[0-60)。
给出五级制成绩(一个字符),请输出这个字符所代表的分数范围。
输入格式:
一个大写的英文字符,代表五级制成绩。
输出格式:
在一行中输出该成绩所表示的整数成绩范围区间,如果该字符不在五级制定义范围之内,输出:ERROR。
输入样例1:
A
输出样例1:
[90-100]
输入样例2:
D
输出样例2:
[60-70)
输入样例3:
X
输出样例3:
ERROR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main() {
char ch;
scanf("%c", &ch);
if (ch=='A')
printf("[90-100]");
else if (ch=='B')
printf("[80-90)");
else if (ch=='C')
printf("[70-80)");
else if (ch=='D')
printf("[60-70)");
else if (ch=='E')
printf("[0-60)");
else
printf("ERROR");
return 0;

}

注意开闭区间

输出星期名

请编写程序,输入星期数,输出对应的英文星期名。

星期数 星期名
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday

输入格式
w

输出格式
若 w 在 0 ~ 6 范围内,则输出星期名
若 w 在 0 ~ 6 范围外,则输出None

输入样例1
3
输出样例1
Wednesday

输入样例2
9
输出样例2
None

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

int main() {
int weekNumber;
scanf("%d", &weekNumber);
switch (weekNumber) {
case 0:
printf("Sunday\n");
break;
case 1:
printf("Monday\n");
break;
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
default:
printf("None\n");
break;
}
return 0;
}

先修课-2024-4

电子汪

据说汪星人的智商能达到人类 4 岁儿童的水平,更有些聪明汪会做加法计算。比如你在地上放两堆小球,分别有 1 只球和 2 只球,聪明汪就会用“汪!汪!汪!”表示 1 加 2 的结果是 3。
本题要求你为电子宠物汪做一个模拟程序,根据电子眼识别出的两堆小球的个数,计算出和,并且用汪星人的叫声给出答案。
输入格式:
输入在一行中给出两个 [1, 9] 区间内的正整数 A 和 B,用空格分隔。
输出格式:
在一行中输出 A + B 个Wang!。
输入样例:
2 1
输出样例:
Wang!Wang!Wang!

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main() {
int a,b;
int i;
scanf("%d%d",&a,&b);
for (i=1;i<=a+b;i++) {
printf("Wang!");
}
return 0;
}

爬动的蠕虫

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
int N,U,D;
scanf("%d%d%d",&N,&U,&D);
int now=0;
int min = 0;
now+=U;
min++;
while (now<N) {
now-=D;
min++;
now+=U;
min++;
}
printf("%d\n",min);
return 0;
}

约分最简分式

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:
对于C语言,在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
对于Python语言,用a,b=map(int, input().split(‘/‘))这样的代码来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如
5/6表示6分之5。
输入样例:
66/120
输出样例:
11/20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int zhanzhuanxiangchufa(int a, int b){
while (b!= 0)
{
int temp = b;
b = a % b;
a = temp;
}
return a;
}


int main() {
int a, b;
scanf("%d/%d", &a, &b);
int result = zhanzhuanxiangchufa(a, b);
printf("%d/%d",a/result,b/result);
return 0;
}

寻找250

img

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。
输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。
输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。
输入样例:
888 666 123 -233 250 13 250 -222
输出样例:
5

用while逐一判定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
int num;
int index = 1;
while (scanf("%d", &num) == 1) {
if (num == 250) {
printf("%d\n", index);
return 0;
}
index++;
}
return 0;
}

用for逐一判定

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main() {
int a, i = 0;
for (;;) {
scanf("%d", &a);
i++;
if (a == 250) {
printf("%d", i);
break;
}
}
return 0;
}

静态数组读进来所有数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

#define MAX_SIZE 100000

int main() {
int numbers[MAX_SIZE];
int size = 0;
int num;
//足够大的数组,存进来
while (scanf("%d", &num) == 1) {
numbers[size++] = num;
}

// 查找并输出第一个250的位置
for (int i = 0; i < size; i++) {
if (numbers[i] == 250) {
printf("%d\n", i + 1);
return 0;
}
} return 0;
}

降价提醒机器人

小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。
输入格式:
输入第一行是两个正整数 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 条价格记录,小 T 设置的价格为 M
接下来 N 行,每行有一个实数 P
输出格式:
对每一条比设定价格 M 便宜的价格记录 P,在一行中输出 On Sale! P,其中 P 输出到小数点后 1 位
输入样例:
4 99
98.0
97.0
100.2
98.9
输出样例:
On Sale! 98.0
On Sale! 97.0
On Sale! 98.9

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main() {
int N, M;
scanf("%d %d", &N, &M);
double P[1005];
for (int i = 0; i < N; i++)
scanf("%lf", &P[i]);
for (int i = 0; i < N; i++)
if (P[i] < M)
printf("On Sale! %.1lf\n", P[i]);
return 0;
}

求特殊方程的正整数解

本题要求对任意给定的正整数N,求方程X^2+Y^2=N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X^2+Y^2=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。
输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <math.h>

int main() {
int N;
scanf("%d", &N);
int found = 0;
for (int X = 1; X <= sqrt(N); X++) {
int Y_squared = N - X * X;
if (Y_squared >= 0) {
double Y = sqrt(Y_squared);
if (Y == (int)Y && X <= Y) {
printf("%d %d\n", X, (int)Y);
found = 1;
}
}
}
if (!found) {
printf("No Solution\n");
}
return 0;
}

注意要保证Y_squared是正的,才可以平方根

计算阶乘和

对于给定的正整数N,需要你计算 S=1!+2!+3!+…+N!。
输入格式:
输入在一行中给出一个不超过10的正整数N。
输出格式:
在一行中输出S的值。
输入样例:
3
输出样例:
9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int jc(int n){
int n_jc=1;
for(int i=1;i<=n;i++){
n_jc*=i;
}
return n_jc;
}

int main() {
int n;
int sum=0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
sum += jc(i);
}
printf("%d", sum);
return 0;
}

先修课-2024-5

大本钟的心情

![img](8c3b8713-1703-4e56-addb-492f738c3a7c.jpg (600×229) (ptausercontent.com))

网友问:未来还会有更多大笨钟题吗?笨钟回复说:看心情……
本题就请你替大笨钟写一个程序,根据心情自动输出回答。
输入格式:
输入在一行中给出 24 个 [0, 100] 区间内的整数,依次代表大笨钟在一天 24 小时中,每个小时的心情指数。
随后若干行,每行给出一个 [0, 23] 之间的整数,代表网友询问笨钟这个问题的时间点。当出现非法的时间点时,表示输入结束,这个非法输入不要处理。题目保证至少有 1 次询问。
输出格式:
对每一次提问,如果当时笨钟的心情指数大于 50,就在一行中输出 心情指数 Yes,否则输出 心情指数 No。
输入样例:
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1
输出样例:
52 Yes
20 No
50 No
58 Yes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main() {
int num[24];
int time = 0;
for (int i = 0; i < 24; i++) {
scanf("%d", &num[i]);
}
while (1) {
scanf("%d", &time);
if (time<0 || time >23)
break;
if (num[time] >50)
printf("%d Yes\n",num[time]);
else
printf("%d No\n",num[time]);

}
return 0;
}

求最大值及其下标

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
输入样例:
6
2 8 10 1 9 10
输出样例:
10 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main() {
int n;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int max_value = a[0];
int min_index = 0;
for (int i = 1; i < n; i++) {
if (a[i] > max_value) {
max_value = a[i];
min_index = i;
} else if (a[i] == max_value && i < min_index) {
min_index = i;
}
}
printf("%d %d\n", max_value, min_index);
return 0;
}

注意题目,要求最大值 和 最大值的最小下标
第一次做了最大值和最小值的的下标

统计分数段人数

请对某次考试的分数,统计各分数段人数,统计原则:分别对10分以下、10-19分、20-29分、30-39分、40-49分、50-59分、60-69分、70-79,80-89分,90到99分,100分为一段,共11段 。
注意:如果输入分数不在[0,100]之间,不参与统计。
输入格式:
先输入一个整数n,表示将输入n个分数。
再输入n个分数,范围在[0100].
每个数用空格间隔。
输出格式:
每一行输出一个分数段的人数统计结果。分数段用0
10表示。
输入样例:
在这里给出一组输入。例如:
6
50 60 98 100 0 1000
输出样例:
在这里给出相应的输出。例如:
0: 1
1: 0
2: 0
3: 0
4: 0
5: 1
6: 1
7: 0
8: 0
9: 1
10: 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main() {
int n;
scanf("%d", &n);
int count[11] = {0};
for (int i = 0; i < n; i++) {
int score;
scanf("%d", &score);
if (score >= 0 && score <= 100) {
count[score/10]++;
}
}
for (int i = 0; i <= 10; i++) {
printf("%d: %d\n", i, count[i]);
}
return 0;
}

C程序设计教程与实训-数组-查找k出现次数

从键盘输入10个整数,将其存入数组中,输入一个整数k,在数组中查找k出现的次数。
输入格式:
在第一行输入10个整数(在int类型的范围内),在第二行输入要查找的整数k。
输出格式:
k出现的次数。如果未出现,输出0。
输入样例:
在这里给出一组输入。例如:
12 13 45 13 45 34 67 12 12 78
12
输出样例:
3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main() {
int n[10];
for (int i = 0; i < 10; i++)
scanf("%d", &n[i]);
int k;
int count = 0;
scanf("%d", &k);
for (int i = 0; i < 10; i++)
if (n[i] == k)
count++;
printf("%d", count);
return 0;
}

求矩阵的局部极大值

给定MN列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。
输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

int main() {
int m, n;
scanf("%d%d", &m, &n);
int a[m][n];
int b[m][n];
int count=0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
b[i][j]=0;
}
}
for (int i=1; i < m-1; i++) {
for (int j = 1 ; j < n-1; j++) {
if (a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j] && a[i][j]>a[i][j-1] && a[i][j]>a[i][j+1]){
b[i][j]=1;
count++;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (b[i][j]) {
printf("%d %d %d\n", a[i][j],i+1,j+1);
}
}
}
if (count==0)
printf("None %d %d",m,n);
return 0;
}

打印杨辉三角

本题要求按照规定格式打印前N行杨辉三角。

输入格式:
输入在一行中给出N(1≤N≤10)。

输出格式:
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。

输入样例:
5
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int main() {
int N;
scanf("%d", &N);
int triangle[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
triangle[i][j] = 1;
} else {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
}

// 打印杨辉三角
for (int i = 0; i < N; i++) {
for (int j = 0; j < (N - i - 1); j++) {
printf(" ");
}
// 打印每一行的数字
for (int j = 0; j <= i; j++) {
printf("%4d", triangle[i][j]); // 每个数字占4个字符宽度
}
printf("\n");
}
return 0;
}

先修课-2024-6

使用函数输出一个整数的逆序数

本题要求实现一个求整数的逆序数的简单函数。
函数接口定义:
int reverse( int number );
其中函数reverse须返回用户传入的整型number的逆序数。
裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int reverse( int number );

int main()
{
int n;

scanf("%d", &n);
printf("%d\n", reverse(n));

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
-12340
输出样例:
-4321

1
2
3
4
5
6
7
8
9
10
11
int reverse(int n) {
int rev = 0;
int sign = n < 0 ? -1 : 1;
n *= sign; //相当于绝对值

while (n > 0) {
rev = rev * 10 + n % 10; //rev向左挪,加入n最后一位
n /= 10; //n去尾
}
return rev * sign;
}

使用函数求最大公约数

本题要求实现一个计算两个数的最大公约数的简单函数。
函数接口定义:
int gcd( int x, int y );
其中x和y是两个正整数,函数gcd应返回这两个数的最大公约数。
裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int gcd( int x, int y );

int main()
{
int x, y;

scanf("%d %d", &x, &y);
printf("%d\n", gcd(x, y));

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
32 72
输出样例:
8

1
2
3
4
5
6
7
8
9
int gcd(int x ,int y ){
int tmp;
while (y!=0){
tmp=y;
y=x%y;
x=tmp;
}
return x;
}

使用函数的选择法排序

本题要求实现一个用选择法对整数数组进行简单排序的函数。
函数接口定义:
void sort( int a[], int n );
其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#define MAXN 10

void sort( int a[], int n );

int main()
{
int i, n;
int a[MAXN];

scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);

sort(a, n);

printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
4
5 1 7 6
输出样例:
After sorted the array is: 1 5 6 7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void sort( int a[], int n ){
int i, j, temp;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (a[j] < a[minIndex]) {
minIndex = j;
}
}
temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}

求排列数

分数 10
作者 颜晖
单位 浙大城市学院
本题要求实现一个计算阶乘的简单函数,使得可以利用该函数,根据公式image-20240817150205282
算出从n个不同元素中取出m个元素(0<m≤n)的排列数。

函数接口定义:
double fact( int n );
其中n是用户传入的参数,函数返回n的阶乘。

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

double fact( int n );

int main(void)
{
int m, n;
double result;

scanf("%d%d", &m, &n);
if(m > 0 && n > 0 && m <= n){
result = fact(n)/fact(n-m);
printf("result = %.0f\n", result);
}

return 0;
}

/* 请在这里填写答案 */

输入样例:
2 14
输出样例:
在这里给出相应的输出。例如:
result = 182

1
2
3
4
5
6
7
double fact(int n){
double jc=1;
for (int i=1;i<n+1;i++){
jc*=i;
}
return jc;
}

先修课-2024-7

程序填空题

填空题未得到系统认证,正确性不作保证
填空题未得到系统认证,正确性不作保证
填空题未得到系统认证,正确性不作保证

一元二次方程求根

输入三个整数a,b,c(a不为0),输出一元二次方程ax^2+bx+c=0的根。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <math.h>
int root(int a,int b,int c,double *p1,double *p2) {
int d=b*b-4*a*c;
if(d>=0){
/* 4分*/=(-b+sqrt(d))/(2*a);
/* 3分*/=(-b-sqrt(d))/(2*a);
return 1;
}
return 0;
}
int main() {
double x1,x2;
int a,b,c;
int flag;
scanf("%d%d%d", &a,&b,&c);
flag=root(a,b,c,/* 3分*/);
if (flag)
printf("%.2f %.2f\n",x1,x2);
else
printf("No\n");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <math.h>
int root(int a,int b,int c,double *p1,double *p2) {
int d=b*b-4*a*c;
if(d>=0){
*p1=(-b+sqrt(d))/(2*a);
*p2=(-b-sqrt(d))/(2*a);
return 1;
}
return 0;
}
int main() {
double x1,x2;
int a,b,c;
int flag;
scanf("%d%d%d", &a,&b,&c);
flag=root(a,b,c,&x1,&x2);
if (flag)
printf("%.2f %.2f\n",x1,x2);
else
printf("No\n");
return 0;
}

查找最高分

输入10个成绩,查找最高分并输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int *GetMax(int score[ ], int n);

int main(void)
{
int i, score[10], *p;
for(i = 0; i < 10; i++){
scanf("%d", &score[i]);
}
p = /* 5分 */
printf("%d\n", *p);
return 0;
}

int *GetMax(int score[ ], int n)
{
int i, max, pos = 0;
for(i = 0 ; i < 10 ; i++){
if(score[i] > max){
max = score[i];
pos = i ;
}
}
return /* 5分 */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int *GetMax(int score[ ], int n);

int main(void)
{
int i, score[10], *p;
for(i = 0; i < 10; i++){
scanf("%d", &score[i]);
}
p = GetMax(score,10);
printf("%d\n", *p);
return 0;
}
int *GetMax(int score[ ], int n)
{
int i, max, pos = 0;
for(i = 0 ; i < 10 ; i++){
if(score[i] > max){
max = score[i];
pos = i ;
}
}
return &score[pos];
}

求二维数组中偶数元素之和

下面这段程序是计算并打印一个二维数组(数组的数组)中值为偶数的元素之和。题目保证输入的元素均为绝对值不超过10000的整数。请填写空缺的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int sumEven(int (*array)[5], int row){
int sum;
;
for(int i=0; i<row; i++)
for(int j=0; j<5; j++)
if( ) sum += ;
return sum;
}
int main(){
int array[4][5];
for(int i=0; i<4; i++)
for(int j=0; j<5; j++)
scanf("%d", );
printf("%d\n", sumEven( ) ); //注意:所填的空之外两端均已有括号,只需填写函数的参数
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int sumEven(int (*array)[5], int row){
int sum;
sum=0;
for(int i=0; i<row; i++)
for(int j=0; j<5; j++)
if(array[i][j]%2==0) sum += array[i][j];
return sum;
}
int main(){
int array[4][5];
for(int i=0; i<4; i++)
for(int j=0; j<5; j++)
scanf("%d",&array[i][j]);
printf("%d\n", sumEven(array,4));
return 0;
}

函数题

计算两数的和与差

本题要求实现一个计算输入的两数的和与差的简单函数。
函数接口定义:

1
void sum_diff( float op1, float op2, float *psum, float *pdiff );

其中op1和op2是输入的两个实数,psum和pdiff是计算得出的和与差。

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

void sum_diff( float op1, float op2, float *psum, float *pdiff );

int main()
{
float a, b, sum, diff;

scanf("%f %f", &a, &b);
sum_diff(a, b, &sum, &diff);
printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);

return 0;
}
/* 你的代码将被嵌在这里 */

输入样例:
4 6
输出样例:
The sum is 10.00
The diff is -2.00

1
2
3
4
5
#include <stdio.h>
void sum_diff(float op1, float op2, float *psum, float *pdiff) {
*psum = op1 + op2;
*pdiff = op1 - op2;
}

拆分实数的整数与小数部分

本题要求实现一个拆分实数的整数与小数部分的简单函数。
函数接口定义:
void splitfloat( float x, int intpart, float fracpart );
其中x是被拆分的实数(0≤x<10000),
intpart和
fracpart分别是将实数x拆分出来的整数部分与小数部分。
裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

void splitfloat( float x, int *intpart, float *fracpart );

int main()
{
float x, fracpart;
int intpart;

scanf("%f", &x);
splitfloat(x, &intpart, &fracpart);
printf("The integer part is %d\n", intpart);
printf("The fractional part is %g\n", fracpart);

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
2.718
输出样例:
The integer part is 2
The fractional part is 0.718

1
2
3
4
5
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart = (int)x;
*fracpart = x - *intpart;
}

使用函数找出数组中的最大值

本题要求实现一个找出整型数组中最大值的函数。
函数接口定义:
int FindArrayMax( int a[], int n );
其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。
裁判测试程序样例:
输入样例:
4
20 78 99 -14
输出样例:
99

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#define MAXN 10

int FindArrayMax( int a[], int n );

int main()
{
int i, n;
int a[MAXN];

scanf("%d", &n);
for( i=0; i<n; i++ ){
scanf("%d", &a[i]);
}

printf("%d\n", FindArrayMax(a, n));

return 0;
}

/* 请在这里填写答案 */

没用指针:

1
2
3
4
5
6
7
8
9
int FindArrayMax( int a[] , int n)
{
int k=0;
for ( int i=1 ; i<n ; i++)
{
if (a[k]<a[i]) k=i;
}
return a[k];
}

使用指针:

1
2
3
4
5
6
7
8
9
int FindArrayMax( int a[] , int n)
{
int *p=a;
for ( int i=1 ; i<n ; i++)
{
if ((*p)<*(a+i)) p=a+i;
}
return *p;
}

编程题

动态内存中数据排序

任务描述:
读入整数N,再读入N个整数,将这N个整数从小到大排序后输出。(不能定义整型数组,用动态内存技术实现)
输入样例:
5
1 5 3 4 2
输出样例:
1 2 3 4 5

使用C99开始的变长数组 GPT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>

// 选择排序算法
void selectionSort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (a[j] < a[minIndex]) {
minIndex = j;
}
}
// 交换找到的最小值与当前位置的值
if (minIndex != i) {
int temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
}

int main() {
int n;
// 读取整数N
scanf("%d", &n);
// 定义大小为n的变长数组
int a[n];
// 读取N个整数
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 对数组进行排序
selectionSort(a, n);
// 输出排序后的数组
for (int i = 0; i < n; i++) {
if (i > 0) {
printf(" ");
}
printf("%d", a[i]);
}
printf("\n");
return 0;
}

使用动态内存 且拆分成模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
int sortArr(int * arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return 0;
}
void printfArr(int * arr,int len)
{
printf("%d",arr[0]);
for (int i=1;i<len;i++)
{
printf(" %d",arr[i]);
}
}
void scanfArr(int * arr,int len)
{
for (int i=0;i<len;i++)
{
scanf("%d",&arr[i]);
}
}
int main()
{
int n;
scanf("%d",&n);
int *arr = (int *)malloc(n*sizeof(int));
scanfArr(arr,n);
sortArr(arr,n);
printfArr(arr,n);
free(arr);
return 0;
}

动态数组(需要多大内存申请多大内存)

任务描述:
输入整数N,再输入N个整数,将这N个整数倒序输出。(不用定义数组,用动态内存实现)
输入样例:
10
1 2 3 4 5 6 7 8 9 10
输出样例:
10 9 8 7 6 5 4 3 2 1
输入样例:
15
708 417 427 843 610 838 932 978 189 981 208 618 178 872 576
输出样例:
576 872 178 618 208 981 189 978 932 838 610 843 427 417 708

偷了上一题的代码,略改了一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
void printfArrDown(int * arr,int len)
{
printf("%d",arr[len-1]);
for (int i=len-2;i>=0;i--)
{
printf(" %d",arr[i]);
}
}
void scanfArr(int * arr,int len)
{
for (int i=0;i<len;i++)
{
scanf("%d",&arr[i]);
}
}
int main()
{
int n;
scanf("%d",&n);
int *arr = (int *)malloc(n*sizeof(int));
scanfArr(arr,n);
printfArrDown(arr,n);
free(arr);
return 0;
}

先修课-2024-8

程序填空题

填空题未得到系统认证,正确性不作保证
填空题未得到系统认证,正确性不作保证
填空题未得到系统认证,正确性不作保证

时间计算

下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即“小时:分钟:秒”,当小时等于24小时,置为0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
struct {
int hour, minute, second;
} time;
int main(void)
{
scanf("%d:%d:%d", );
time.second++;
if( == 60){

time.second = 0;
if(time.minute == 60){
time.hour++;
time.minute = 0;
if( )
time.hour = 0;
}
}
printf ("%d:%d:%d\n", time.hour, time.minute, time.second );
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

#include <stdio.h>
struct {
int hour, minute, second;
} time;
int main(void)
{
scanf("%d:%d:%d", &time.hour, &time.minute, &time.second);
time.second++;
if( time.second == 60){
time.minute++;
time.second = 0;
if(time.minute == 60){
time.hour++;
time.minute = 0;
if( time.hour == 24)
time.hour = 0;
}
}
printf ("%d:%d:%d\n", time.hour, time.minute, time.second );
return 0;
}

分段统计学生成绩

输入n个学生的姓名和百分制成绩,分段统计学生的成绩。
输入格式:
输入在第一行中给出正整数N(1≤n≤100)。随后N行,每行给出一位学生的姓名和成绩,中间以空格分隔。
输出格式:
在一行中顺序输出成绩为80-100分、60-79分、0-59分的学生人数,中间以空格分隔。
输入样例:
5
huanglan 83
wanghai 76
shenqiang 50
zhangfeng 95
zhangmeng 60
输出样例:
2 2 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
#define MAXN 100
struct student{
char name[20];
int score;
};
void cnt_score( struct student *p, int n );

int main()
{
int i, n;
struct student stu[MAXN];

scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%s%d", stu[i].name, &stu[i].score);
}
cnt_score(stu, n);
return 0;
}

void cnt_score(struct student *p, int n)
{
int cnt_a = 0, cnt_p = 0, cnt_f = 0;
/**/
while ( p <= q ){
if (/**/) cnt_a++;
else if (/**/) cnt_p++;
else cnt_f++;
p++;
}
printf("%d %d %d\n", cnt_a, cnt_p, cnt_f);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
#define MAXN 100
struct student{
char name[20];
int score;
};
void cnt_score( struct student *p, int n );

int main()
{
int i, n;
struct student stu[MAXN];

scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%s%d", stu[i].name, &stu[i].score);
}
cnt_score(stu, n);
return 0;
}

void cnt_score(struct student *p, int n)
{
int cnt_a = 0, cnt_p = 0, cnt_f = 0;
struct student *q= p+n-1;
while ( p <= q ){
if (p->score>=80 && p->score<=100) cnt_a++;
else if (p->score>=60) cnt_p++;
else cnt_f++;
p++;
}
printf("%d %d %d\n", cnt_a, cnt_p, cnt_f);
}

编程题

有理数均值

本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1

自己写的狗屎代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h>

//最大公约数
int gcd(long long a, int b) {
a = abs(a);
b = abs(b);
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}

//最小公倍数
int lcm(int a, int b) {
return abs(a * b) / gcd(a, b);
}

//两个分数相加 参数分别为 分数1的分子,分数1的分母,分数2的分子,分数2的分母
void plusFraction(int *arrA1, int *arrB1,int *arrA2, int *arrB2) {
int LCM = lcm(*arrB1, *arrB2);
*arrA1 = *arrA1 * (LCM / *arrB1);
*arrA2 = *arrA2 * (LCM / *arrB2);
*arrB1 = LCM;
*arrB2 = LCM;
*arrA1 += *arrA2;
*arrA2 = *arrA1;
}

//分数约分 参数分别为 分子,分母
void simplifyFraction(int *arrA, int *arrB) {
int GCD = gcd(*arrA, *arrB);
*arrA /= GCD;
*arrB /= GCD;
}

//分数打印 参数分别为 分子,分母
void printFraction(int numerator, int denominator) {
if (denominator == 1) {
printf("%d\n", numerator);
} else {
printf("%d/%d\n", numerator, denominator);
}
}
int main() {
int n;
scanf("%d", &n);
int *arrA = (int *)malloc(n * sizeof(int)); //记录分子
int *arrB = (int *)malloc(n * sizeof(int)); //记录分母
for (int i = 0; i < n; i++) {
scanf("%d/%d", &arrA[i], &arrB[i]);
simplifyFraction(&arrA[i], &arrB[i]);
//读取的时候就要化简 我被这个缠了半小时
}
for (int i = 1; i < n; i++) {
plusFraction(&arrA[0], &arrB[0], &arrA[i], &arrB[i]);
simplifyFraction(&arrA[0], &arrB[0]);
}
int numerator=arrA[0]; //结果的分子
int denominator=arrB[0]*n; //结果的分母
simplifyFraction(&numerator, &denominator);
printFraction(numerator, denominator);
free(arrA);
free(arrB);
return 0;
}

GPT写的我是弱智

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>

// 求最大公约数
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}

int main() {
int N, nume_sum = 0, denom_sum = 1;
scanf("%d", &N);

for (int i = 0; i < N; ++i) {
int nume, denom;
scanf("%d/%d", &nume, &denom);

// 累加分数到总和中
nume_sum = nume_sum * denom + nume * denom_sum;
denom_sum *= denom;

// 化简当前总和
int g = gcd(nume_sum, denom_sum);
nume_sum /= g;
denom_sum /= g;
}

// 计算平均值
denom_sum *= N;

// 化简最终结果
int g = gcd(nume_sum, denom_sum);
nume_sum /= g;
denom_sum /= g;

// 输出结果
if (denom_sum == 1)
printf("%d\n", nume_sum);
else
printf("%d/%d\n", nume_sum, denom_sum);

return 0;
}

找出总分最高的学生

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258

注意学号应该是str而非int 输出可能为 000001

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
struct stus {
char name[20];
int grade1;
int grade2;
int grade3;
char num[6];
int sum;
};
int main()
{
int n;
scanf("%d", &n);
struct stus stu[n];
for (int i = 0; i < n; i++)
{
scanf("%s %s %d %d %d", &stu[i].num, stu[i].name, &stu[i].grade1, &stu[i].grade2, &stu[i].grade3);
stu[i].sum = stu[i].grade1 + stu[i].grade2 + stu[i].grade3;
}
struct stus *pmax = &stu[0];
for (int i = 1; i < n; i++)
{
if (stu[i].sum > pmax->sum)
{
pmax = &stu[i];
}
}
printf("%s %s %d\n", pmax->name, pmax->num, pmax->sum);
return 0;
}

通讯录排序

输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
输入格式:
输入第一行给出正整数n(<10)。随后n行,每行按照“姓名 生日 电话号码”的格式给出一位朋友的信息,其中“姓名”是长度不超过10的英文字母组成的字符串,“生日”是yyyymmdd格式的日期,“电话号码”是不超过17位的数字及+、-组成的字符串。
输出格式:
按照年龄从大到小输出朋友的信息,格式同输出。
输入样例:
3
zhang 19850403 13912345678
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
输出样例:
wang 19821020 +86-0571-88018448
qian 19840619 13609876543
zhang 19850403 13912345678

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>
struct stus
{
char name[11];
char bir[9];
char tel[18];
};
int main(){
int n;
scanf("%d",&n);
struct stus stu[n];
for (int i=0;i<n;i++)
{
scanf("%s %s %s",stu[i].name,stu[i].bir,stu[i].tel);
}
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
{
if ( atoi(stu[i].bir) > atoi(stu[j].bir )) //见下面解释
{
struct stus temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
for (int i=0;i<n;i++)
{
printf("%s %s %s\n",stu[i].name,stu[i].bir,stu[i].tel);
}
}

如何将str转换为int

如何将str转换为int
看看GPT怎么做

在C语言中,str 类型指的是字符串(即 char 数组),要将字符串(如 "123")强制转换为整数类型,你可以使用标准库函数 atoi()strtol()。这两个函数可以将字符串转换为整数。

使用 atoi() 函数

atoi() 将字符串转换为整数(int 类型)。这是一个简单的转换函数,但它没有错误处理。

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>

int main() {
char str[] = "123";
int num = atoi(str); // 转换字符串为整数
printf("整数值: %d\n", num);
return 0;
}
使用 strtol() 函数

strtol()(String to Long)提供了更强的错误处理功能。它不仅可以转换字符串,还能检测到转换过程中的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>

int main() {
char str[] = "123";
char *endptr;
long num = strtol(str, &endptr, 10); // 转换字符串为长整数

if (*endptr == '\0') { // 检查是否全部成功转换
printf("整数值: %ld\n", num);
} else {
printf("转换过程中出现错误\n");
}
return 0;
}
使用说明:
  • **atoi()**:直接使用,没有错误检测。如果输入不是合法的数字字符串,行为未定义。
  • **strtol()**:提供更多控制,能处理错误情况,比如字符串中包含非法字符。

一帮一

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John

自己写的,感觉思路很直接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <string.h>
struct stus
{
char name[15];
};
int main(){
int n;
scanf("%d",&n);
struct stus man[n/2];
struct stus women[n/2];
int cntMan=0;
int cntWoman=0;
int sort[n];
for (int i=0;i<n;i++){
int sex;
char name[15];
scanf("%d %s",&sex,name);
if (sex==1){
strcpy(man[cntMan].name, name);
cntMan++;
sort[i]=1;
}else
{
strcpy(women[cntWoman].name, name);
cntWoman++;
sort[i]=0;
}
}
int headMan=0;
int headWoman=0;
int tailMan=cntMan-1;
int tailWoman=cntWoman-1;
for (int i=0;i<n/2;i++){
if (sort[i]==1){
printf("%s %s\n",man[headMan].name,women[tailWoman].name);
headMan++;
tailWoman--;
}else
{
printf("%s %s\n",women[headWoman].name,man[tailMan].name);
headWoman++;
tailMan--;
}
}
return 0;
}

先修课-2024-9

删除重复字符

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 80

int main() {
char input[MAX_LENGTH + 1];
int present[256] = {0};
char result[MAX_LENGTH + 1];
int count = 0;
scanf("%80[^\n]", input); //最多80个字符
for (int i = 0; i < strlen(input); i++) {
unsigned char ch = input[i];
if (present[ch] == 0) {
present[ch] = 1;
result[count++] = ch;
}
}
result[count] = '\0'; // 终止字符
// 排序
for (int i = 0; i < count - 1; i++) {
for (int j = i + 1; j < count; j++) {
if (result[i] > result[j]) {
// 交换
char temp = result[i];
result[i] = result[j];
result[j] = temp;
}
}
}
printf("%s\n", result);
return 0;
}

输出GPLT

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT….这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
pcTclnGloRgLrtLhgljkLhGFauPewSKgt
输出样例:
GPLTGPLTGLTGLGLL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <string.h>
int count_word(const char * str , char ch){
int cnt=0;
int len=strlen(str);
for (int i=0;i<len;i++){
if (str[i]==ch){
cnt++;
}
}
return cnt;
}

int main(){
char str[10001];
int g=0,p=0,l=0,t=0;
scanf("%s",str);
g=count_word(str,'G')+count_word(str,'g');
p=count_word(str,'P')+count_word(str,'p');
l=count_word(str,'L')+count_word(str,'l');
t=count_word(str,'T')+count_word(str,'t');
while (g+p+l+t !=0){
if (g!=0){
printf("G");
g--;
}
if (p!=0){
printf("P");
p--;
}
if (l!=0){
printf("L");
l--;
}
if (t!=0){
printf("T");
t--;
}
}
return 0;
}

A-B

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10^4,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It’s a fun game!
aeiou
输出样例:
I lv GPLT! It’s fn gm!

使用gets获取一整行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
char strA[10001];
char strB[10001];
int main(){
gets(strA);
gets(strB);
int lenA=strlen(strA);
for (int i=0;i<lenA;i++){
if (strchr(strB,strA[i])==NULL){
printf("%c",strA[i]);
}
}
return 0;
}

检查密码

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。
输入格式:
输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。
注意: 题目保证不存在只有小数点的输入。
输出格式:
对每个用户的密码,在一行中输出系统反馈信息,分以下5种:
如果密码合法,输出Your password is wan mei.;
如果密码太短,不论合法与否,都输出Your password is tai duan le.;
如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.;
如果密码长度合法,但只有字母没有数字,则输出Your password needs shu zi.;
如果密码长度合法,但只有数字没有字母,则输出Your password needs zi mu.。
输入样例:
5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6
输出样例:
Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
int N;
scanf("%d", &N);
getchar();

for (int i = 0; i < N; i++) {
char password[81];
gets(password);

int len = strlen(password);
int has_digit = 0, has_alpha = 0, valid = 1;

if (len < 6) {
printf("Your password is tai duan le.\n");
continue;
}

for (int j = 0; j < len; j++) {
if (isdigit(password[j])) {
has_digit = 1;
} else if (isalpha(password[j])) {
has_alpha = 1;
} else if (password[j] != '.') {
valid = 0;
break;
}
}

if (!valid) {
printf("Your password is tai luan le.\n");
} else if (!has_digit) {
printf("Your password needs shu zi.\n");
} else if (!has_alpha) {
printf("Your password needs zi mu.\n");
} else {
printf("Your password is wan mei.\n");
}
}
return 0;
}

*持续更新中。。。
若未更新,请发邮件至 me@zyzblog.com