L1-017 到底有多二
题目内容:
解题思路:
本题主要任务是从输入的数字中 获取2的个数,获取数字的长度,是否为负数,是否为偶数。
本题难度并不特别大,就只提供几个建议进行参考:
1.使用字符数组进行存储,由于本题需要获取长度,并且其余操作也都是单个位置上的数据进行判断。
2.数字长度与是否为负数有关,可以定义一个标记量,在判断是否为负数后,修改标记量。
3.输出为百分比,故最后要 * 100,同时要注意%的输出。
C代码展示:
#include <stdio.h>
#include <string.h>
int main() {
int cnt = 0, k = 0; // 定义计数器cnt,用于统计'2'的数量,k用于调整字符串长度
float ans, x = 1; // 定义答案变量ans,以及调整因子x
char s[100]; // 定义字符数组s,用于存储输入的字符串
gets(s); // 使用gets函数读取字符串。
if (s[0] == '-') { // 如果字符串的第一个字符是'-'
x *= 1.5; // 调整因子x乘以1.5
k = -1; // 将k设置为-1,用于后续调整字符串长度
}
if ((s[strlen(s) - 1] - '0') % 2 == 0) { // 如果字符串最后一个字符是偶数
x *= 2; // 调整因子x乘以2
}
for (int i = 0; i < strlen(s); i++) { // 遍历字符串中的每个字符
if (s[i] == '2') { // 如果字符是'2'
cnt++; // '2'的计数器加1
}
}
ans = 1.0 * cnt / (strlen(s) + k) * x * 100; // 计算百分比,考虑调整因子和调整后的字符串长度
printf("%.2f%%\n", ans); // 输出计算出的百分比,保留两位小数
return 0;
}
L1-018 大笨钟
题目内容:
解题思路:
本题按照小时分为三种情况:12时内,正好为12时,大于12时。然后根据分钟还需要进行一些调整。
12时内:固定不会输出。
12时时:当分钟不为0时,输出一个Dang。
12时后,当分钟不为0时,输出的Dang需要增加一次。
C代码展示:
#include <stdio.h>
int main() {
int h, m, k = 0; // 定义整数变量h(小时)、m(分钟)和k(用于调整小时数)
scanf("%d:%d", &h, &m);
if (h < 12) {
printf("Only %02d:%02d. Too early to Dang.\n", h, m);
}
else if (h == 12) {
if (m == 0) {
printf("Only %02d:%02d. Too early to Dang.\n", h, m);
}
else {
printf("Dang\n");
}
}
else {
if (m > 0) k++; // 如果分钟数大于0,k加1,用于后续计算
for (int i = 0; i < h - 12 + k; i++) { // 循环次数为小时数减去12再加上k
printf("Dang");
}
printf("\n");
}
return 0;
}
L1-019 谁先倒
题目内容:
解题思路:
本题只需要一次循环遍历每次的猜拳情况,然后增加甲或乙的喝酒杯数。
注意点:题中所说的最多喝的杯数是他不会倒的,例如,甲的杯数为2,那当甲喝了3杯时才会倒下。
C代码展示:
#include <stdio.h>
int main() {
int a, b, _a=0, _b=0, n, k;
// 定义甲、乙的初始酒量a、b,甲、乙喝的杯数_a、_b,划拳记录数n,以及中间变量k
int s[105][5];
scanf("%d %d", &a, &b);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < 4; j++)
scanf("%d", &s[i][j]);
if (!(a - _a < 0 || b - _b < 0)) { // 如果甲、乙都没倒下
k = 0; // 初始化k
if (s[i][1] == s[i][0] + s[i][2]) { // 如果甲划的数字等于甲喊与乙喊之和
k += 1; // k设置为1,表示甲赢
}
if (s[i][3] == s[i][0] + s[i][2]) { // 如果乙划的数字等于甲喊与乙喊之和
k += 2; // k设置为2,表示乙赢
}
if (k == 1) { // 如果k为1,甲赢,甲喝酒杯数增加
_a++;
}
if (k == 2) { // 如果k为2,乙赢,乙喝酒杯数增加
_b++;
}
}
}
if (a - _a < 0) { // 如果甲的酒量减去甲喝的杯数小于0,说明甲倒下了
printf("A\n%d\n", _b); // 输出A和乙喝的杯数
} else { // 否则就是乙倒下了,输出B和甲喝的杯数
printf("B\n%d\n", _a);
}
return 0;
}
L1-020 帅到没朋友
题目内容:
解题思路:
本题可以为二维字符数组存储,也可以是整型数组存储,但是整型数组存储时要注意使用%05d进行输出,它存在少于五位数字的情况。
注意点1:要是一个朋友圈里就一个人,题目说超过一个人的朋友圈一定是不同的人,也就是说超过1的朋友圈里的人都有朋友,反之没有。
注意点2:处理重复查询的情况,可以进行标记。
注意点3:处理所有人都有朋友时,可以用标记量,当有一人没有朋友时,改变标记量即可。
C代码展示:
#include <stdio.h>
int main() {
int n, flag = 1;
int id[100005] = {0};
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int k;
scanf("%d", &k);
for (int j = 0; j < k; j++) {
int temp; // 定义变量temp,用于临时存储输入的元素
scanf("%d", &temp);
if (k != 1) { // 如果序列的长度不为1
id[temp]++; // 对应元素的标记状态加1
}
}
}
int m; // 定义变量m,用于存储后续输入的数量
scanf("%d", &m); // 读取后续输入的数量
for (int i = 0; i < m; i++) {
int temp; // 定义变量temp,用于临时存储输入的元素
scanf("%d", &temp);
if (id[temp] == 0) { // 如果该元素的标记状态为0,即未被标记过
if (flag) { // 如果这是第一个未标记的元素
printf("%05d", temp); // 输出该元素,格式为5位数,不足前面补0
flag = 0; // 更新flag状态,表示已经输出过未标记的元素
} else { // 如果不是第一个未标记的元素
printf(" %05d", temp); // 输出该元素,前面有空格
}
id[temp] = -1; // 将该元素的标记状态设置为-1,表示已经输出过
}
}
if (flag) { // 如果所有元素都被标记过
printf("No one is handsome");
}
printf("\n");
return 0;
}
L1-021 重要的话说三遍
题目内容:
解题思路:
略。
C代码展示:
#include <stdio.h>
int main()
{
printf("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!\n");
return 0;
}
L1-022 奇偶分家
题目内容:
解题思路:
循环遍历,用%2 == 0进行判断,为真是偶数,为假是奇数。
C代码展示:
#include <stdio.h>
int main()
{
int n, a;
int ou = 0, qi = 0;
scanf("%d", &n);
for (int i=0; i<n; i++){
scanf("%d", &a);
if (a % 2 == 0){
ou ++;
}
else{
qi ++;
}
}
printf("%d %d\n", qi, ou);
return 0;
}
L1-023 输出GPLT
题目内容:
解题思路:
循环遍历输入的字符串,当它为 G、P、L、T 或 g、p、l、t 时,使用哈希表进行存储。
输出时,按照GPLT的顺序判断哈希表中的值是否为0,不为零就输出,当所有值都为0时跳出循环。
C代码展示:
#include <stdio.h>
#include <string.h>
int main()
{
char s[10005];
int cnt[5] = {0};
gets(s);
for (int i=0; i<strlen(s); i++){
if (s[i] == 'g' || s[i] == 'G'){
cnt[0]++;
}
if (s[i] == 'p' || s[i] == 'P'){
cnt[1]++;
}
if (s[i] == 'l' || s[i] == 'L'){
cnt[2]++;
}
if (s[i] == 't' || s[i] == 'T'){
cnt[3]++;
}
}
while(cnt[0] + cnt[1] + cnt[2] + cnt[3]){
if (cnt[0] > 0){
printf("G");
cnt[0] --;
}
if (cnt[1] > 0){
printf("P");
cnt[1] --;
}
if (cnt[2] > 0){
printf("L");
cnt[2] --;
}
if (cnt[3] > 0){
printf("T");
cnt[3] --;
}
}
printf("\n");
return 0;
}
L1-024 后天
题目内容:
解题思路:
略。
C代码展示:
#include <stdio.h>
int main()
{
int d;
scanf("%d",&d);
if (d>5) printf("%d\n",d-5);
else printf("%d\n",d+2);
return 0;
}