总结:国庆还是下手轻了 基本也还是熟悉语言环境
国庆题三
一、WHW刷题
WHW学长是一个非常重视课内学习的学长,他每天都会刷题,一个星期中,他周一到周五会刷300题,周六周日时间充裕,会刷500题。
从星期n开始算(算星期n),经过m天后,你想算算一下他从第x天到第y天内刷了多少题,但是不好意思直接问他,聪明的你写了一个程序轻松算出了他写了多少题。
数值:n(1~7),m(m < 10000),x ,y同m。
输入
5 3 1 4
1 7 2 6
7 1 1 2
样例输入
1 9999 1 9999
输出
1600
1700
800
样例输出
3570900
代码实现
int main()
{
int n = 0;//起源星期
int m = 0;//边界 没用
int x = 0;//起始星期
int y = 0;//结束星期
int temp = 0;
int weekday = 0;//记录工作日天数
int weekend = 0;//记录周末天数
scanf("%d%d%d%d", &n, &m, &x, &y);
for (int i = n + x - 1; i <= n + y - 1; i++)
{
temp = i % 7;//防止超过7
if (1 <= temp && temp <= 5)
{
weekday++;
}
else
{
weekend++;
}
}
int total = 0;
total = 300 * weekday + 500 * weekend;
printf("%d", total);
return 0;
}
经验总结
不要被题目吓到 先动手试下。
二、坏种造车(没做出来)
启明星智能组打比赛时使用的三楼实验室有很多A4988电机驱动,但是有些电机驱动由于内部结构损坏,芯片逻辑门烧毁而无法使用,我们称之为坏种。
为了筹备工训赛,LHK学长使用V个A4988作为机械臂的驱动,V我们称之为转化属性,也就是说V个A4988可以满足一整台工程机器人的使用需求,不满V个A4988驱动显然造不出一台机器人。 现在实验室有N次比赛记录,其中包含两个数据A和B,A表示此次比赛实验室能找到的所有A4988(个),B表示最终转化的机器人数量(台),实验结果显示,这批A个A4988驱动中有m都是坏种(m数值范围:0~0.99)。
每次比赛是独立的,所以每次比赛中未使用完的电机驱动不会留到下一次比赛。 根据这N次比赛记录,请你猜测一下V转化属性是多少? 题目保证评测数据不存在无解的情况。
输入
第一行两个数:N m
//表示比赛的次数,m是坏种率
接下来输入N行,每行两个整数A,B 含义如题目表述所示
3 0.5
75 3
53 2
59 2
样例输入
3 0.5
75 3
53 2
59 2
输出
输出两个整数,分别表示 V (转化属性)可能的最小值和最大值,中间用空格分开。
10 12
样例输出
10 12
三、学长奖励(寻找包含x的数和x的约数)
智能组今年来了16个新同学,学长们想用奖励的方式来促进同学们积极学习,吸收知识,结果,国庆节期间他们都很认真地完成了学长们出的国庆综合测试题,每一个人都很优秀,这可让学长们犯了难。
CQL学长很喜欢“3”这个数字,于是他想要这次要把奖励发给所有和“3”有关的同学,下一次再奖励其他所有同学。但是MKK学长很喜欢“4”,而MJZ学长很喜欢“6”,大家意见不同。
ZC学长为了解决这个困扰所以向你请求帮助,聪明的你写了一个完美的C语言程序解决了他的困难,为了程序功能更有可移植性,让更多学长都喜欢使用,你直接写出了:在n个人中,输出号码可以被m整除的,和号码数中包含m的所有的成员号码。
注意:90 91 92 93 99 这些都包含9
119 191 911 也都包含9
题干本意就是让你找出从从1到某个数之间能被x整除或者包含x的所有数而已
输入
两个整数,n,m
表示输入为在n个人中,选中可被m整除和号码数含有m的号码。数据不大,int足够满足。
例如:16 3
样例输入
16 3
输出
一行号码数,中间带有空格,例如:
3 6 9 12 13 15
样例输出
3 6 9 12 13 15
代码实现
int bao(int x, int y)//寻找包含x的数字
{
while (x > 0) //逐位寻找
{
if (x % 10 == y) {
return 1;
}
x /= 10;
}
return 0;
}
int main()
{
int n, x;
int i;
scanf("%d%d", &n, &x);
for (i = 1; i <= n; i++) {
if (i % x == 0 || bao(i, x)) {
printf("%d ", i);
}
}
return 0;
}
经验总结
熟悉了模的运用
四、串口数据(没做出来)
LX学姐在使用STM32打比赛的时候最常用的通信方式就是串口通信,一般我们发送的数据包结构是:数据头@+数据内容+数据尾##。
例如:@01,111,111,222,222,333,333##
LX学姐使用@后面的01来代表任务号,例如01就是需要读取111,111上代表的目的点坐标值,02就是读取222,222上的坐标值,03以此类推。然而在实际应用里,中断收到的数据包并不是归整有序的,而是很多段数据包在一起的集合。假如在20ms内,中断收到了M个字符类型的数据包(M<=500),例如以下这段数据:
...1,222,222,333,333##@01,111,111,222,222,333,333##@02,111,111,222,222,333,333##@03,111,111,222...
LX学姐想请你帮帮她,将数据包里的数据分析整合出来。
只收集完整的数据包,没有数据头和数据尾的数据包不作处理。
输入
,222,222,333,333##@01,111,111,222,222,333,333##@02,122,113,222,222,333,333##@02,111,111,321,123,333,333##@03,111,111,222,22
样例输入
,222,222,333,333##@01,111,111,222,222,333,333##@02,122,113,222,222,333,333##@02,111,111,321,123,333,333##@03,111,111,222,22
输出
01:
111,111
02:
222,222
321,123
03:
样例输出
01:
111,111
02:
222,222
321,123
03:
五、扫雷兵王(没做出来)
智能组五楼的柜子里有很多电子元器件,工作室的柜子大小是n*m,但是顽皮的LZB学长和TZQ学长悄悄放了几个电源反接的电容到某些格子中,等你拉开格子就会合上开关,BOOM!~~
反接电容是Q,如果没有则是O,为了避免实验室发生意外,请你写一套程序:
当有人选中含有反接电容的柜子的时候,程序会输出“Q!”警告。
当选中附近3*3范围内含有反接电容的柜子的时候,会输出“!”作为提醒。
输入:
第一个输入是柜子大小n m的值
第二个输入是炸弹的数量V
第三组输入是炸弹的坐标x y
第四组输入是要准备的柜子坐标x0 y0
输出:
只有一个输出Q!或者是!
输入
5 5
2
0 2
0 4
1 3
样例输入
5 5
1
3 3
0 0
输出
!
样例输出
O
六、整理开发板(字母排序)
PJY学姐最近购买了一大批开发板,可能的型号有26种(A~Z),她想请你帮忙整理一下,从A~Z的顺序依次有序排列在桌上。
当然,有些型号的开发板不止一个,有些型号的开发板并没有购买。
简单的排序问题
输入
ZXCVBSDFGHWERTYU
ZZZZZZZZZZZZZZZZZZZZA
FGYUIKJBVFTYUIOKJIJ
样例输入
ZXCVBSDFGHWERTYU
ZZZZZZZZZZZZZZZZZZZZA
FGYUIKJBVFTYUIOKJIJ
输出
BCDEFGHRSTUVWXYZ
AZZZZZZZZZZZZZZZZZZZZ
BFFGIIIJJJKKOTUUVYY
样例输出
BCDEFGHRSTUVWXYZ
AZZZZZZZZZZZZZZZZZZZZ
BFFGIIIJJJKKOTUUVYY
代码实现
#include <string.h>
void biaopai(char a[]) {
char b[26] = { 0 };
for (int i = 0; i < strlen(a); i++) {
if (a[i] >= 'A' && a[i] <= 'Z') {
b[a[i] - 'A']++;//ascll码错位标记
}
}
for (int i = 0; i < 26; i++) {//第i个标记位
for (int j = 0; j < b[i]; j++) {//有j次标记
printf("%c", 'A' + i);
}
}
putchar('\n');
}
int main()
{
char a[100];
int i = 0;
while (gets_s(a))
biaopai(a);
return 0;
}
经验总结
利用ascll错位标记(指针偏移的思想) 排序不一定就是排序 还可以是重现
七、斐波那契数列求和
启明星招新的时候,PJY学姐出了一道题是这样的:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前n项之和。
现在LX学姐想请你帮他整理一下这个编程题的标准答案,希望你不要让她失望*~*
输出只保留两位小数
输入
20
样例输入
20
输出
32.66
样例输出
32.66
代码实现
int main()
{
int N;
double n = 2, m = 1, sum = 0, t;
int i;
scanf("%d", &N);
for (i = 1; i <= N; i++)
{
sum = sum + n / m;
t = n;
n = m + n;
m = t;
}
printf("%.2f", sum);
}
经验总结
真没啥 就是找到数学规律的简单模拟。