L1-033 出生年
题目内容:
解题思路:
注意点1:不同的数字个数 不能多 也 不能少。
注意点2:输出的年份占四格。
按照这两个注意点,我提供一下我的思路。
首先针对第一点,我的处理方法是设置一个flag,然后让它每遇到一个不同的数字都自减,然后在这个思路的基础上,加入了哈希表,遍历哈希表,当值大于1时,也即出现次数多于一次时,flag -= a[i] - 1。
然后对于不能多和不能少的判定就是flag == 0,然后输出年份占四个也就是%04d。
C代码展示:
#include <stdio.h>
int main() {
int y, n, cnt = 0;
scanf("%d %d", &y, &n); // 读取起始数字和要找到的满足条件的数字的序号
for ( ; ; y++, cnt++) { // 无限循环,每次循环y增加1,计数器cnt也增加1
int a[10] = {0}; // 定义数组a,用于存储每个数字(0-9)在y中出现的次数,初始化为0
int flag = 4 - n; // 定义变量flag,用于判断是否满足条件,初始化为4-n
for (int temp = y, i = 0; i < 4; temp /= 10, i++) { // 遍历数字y的每一位,只遍历4位
a[temp % 10]++; // 增加数组a中对应数字的出现次数
}
for (int i = 0; i < 10; i++) { // 遍历数组a
if (a[i] > 1) flag -= a[i] - 1; // 如果某个数字出现超过一次,则flag减去多余的次数
}
if (flag == 0) { // 如果flag等于0,说明找到了满足条件的数字
printf("%d %04d\n", cnt, y); // 数字y格式化为4位,不足前面补0
break;
}
}
return 0;
}
L1-034 点赞
题目内容:
解题思路:
由于标签的界限是从1到1000,整体数量并不多,故我采取了哈希表的方式。
然后,为了节约时间复杂度,我在每次自增时加入与最大值的判定,避免最后再进行一次循环,找次数最多的。
C代码展示:
#include <stdio.h>
int main() {
int n, ff, max = 0, cnt[1005] = {0};
// 定义变量n(组数),ff(出现次数最多的数字),max(出现次数),
cnt数组(用于存储每个数字的出现次数)
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int k;
scanf("%d", &k); // 读取每组中的数字数量
for (int j = 0; j < k; j++) { // 遍历每组中的每个数字
int a; // 定义变量a,用于存储当前读取的数字
scanf("%d", &a); // 读取当前数字
cnt[a]++; // 增加数组cnt中对应数字的出现次数
if (max < cnt[a]) { // 如果当前数字的出现次数大于已知的最大出现次数
max = cnt[a]; // 更新最大出现次数
ff = a; // 更新出现次数最多的数字
}
else if (max == cnt[a]) { // 如果当前数字的出现次数等于已知的最大出现次数
if (ff < a) { // 如果已知的出现次数最多的数字大于当前数字
max = cnt[a]; // 更新最大出现次数
ff = a; // 更新出现次数最多的数字
}
}
}
}
printf("%d %d\n", ff, max);
return 0;
}
L1-035 情人节
题目内容:
解题思路:
用一个循环进行输入,都存入二维数组s中,一直判定到输入为 “ . ”。
跳出循环后,判定循环自增量i,按照题目需求分为三种情况,按照需求输出即可。
C代码展示:
#include <stdio.h>
int main()
{
int i=0;
char s[10000][100];
for (i=1;;i++)
{
gets(s[i]);
if (s[i][0]=='.') break;
}
i--;
if (i>=14)
printf("%s and %s are inviting you to dinner...\n",s[2],s[14]);
else if(i>=2)
printf("%s is the only one for you...\n",s[2]);
else
printf("Momo... No one is for you ...\n");
return 0;
}
L1-036 A乘以B
题目内容:
解题思路:
略。
C代码展示:
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a*b);
return 0;
}
L1-037 A除以B
题目内容:
解题思路:
题目表示,按照分母划分为三种情况:
分母 > 0 :直接输出。
分母 == 0 :输出分子,分母,结果变为Error。
分母 < 0 :在分母上加个括号。
C代码展示:
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
if (b > 0) { // 如果除数b是正数
printf("%d/%d=%.2f\n", a, b, 1.0 * a / b); // 输出除法结果,保留两位小数
} else if (b == 0) { // 如果除数b是零
printf("%d/%d=Error\n", a, b); // 输出错误信息
} else { // 如果除数b是负数
printf("%d/(%d)=%.2f", a, b, 1.0 * a / b); // 输出除法结果,并将负数标记在括号内,保留两位小数
}
return 0;
}
L1-038 新世界
题目内容:
解题思路:
略。
C代码展示:
#include <stdio.h>
int main()
{
printf("Hello World\nHello New World\n");
return 0;
}
L1-039 古风排版
题目内容:
解题思路:
题目整体思路分为两层,第一层是判断字符串会按照n划分为几列,第二层为按照古风格式输出。
难点在于第二步,而它主要面临的是两个问题,第一个问题是,它输出的字符在字符串的哪个位置,第二个问题是,最后一列不满的情况输出空格。
对于第一个问题,我的计算方式是 r * j + i ,就相当于将字符串分为了r段,然后每一次输出每一段的同一部分。对于第二个问题,其实就是按照上面的计算方式,如果数值大于了字符串的长度,则输出空格即可。
C代码展示:
#include <stdio.h>
#include <string.h>
int main() {
int l, r, x; // 定义变量l(每行的长度),r(列数),x(剩余字符数)
char s[1005]; // 定义字符数组s,用于存储输入的字符串
scanf("%d", &r); // 读取列数
getchar(); // 读取并丢弃缓冲区中的换行符,为gets函数做准备
gets(s); // 使用gets函数读取一行字符串。
l = strlen(s) / r; // 计算每行的长度
x = strlen(s) % r; // 计算剩余字符数
if (x > 0) l++; // 如果有剩余字符,增加一行的长度
for (int i = 0; i < r; i++) { // 遍历每一列
for (int j = l - 1; j >= 0; j--) { // 从最后一行开始向上遍历
int index = r * j + i; // 计算当前字符的索引
if (index >= strlen(s)) { // 如果索引超出字符串长度,打印空格
printf(" ");
} else { // 否则,打印字符
printf("%c", s[index]);
}
}
printf("\n");
}
return 0;
}
L1-040 最佳情侣身高差
题目内容:
解题思路:
本题主要难点在于,%c它会读\n,所以在每一次输入之前需要把\n给读掉。或者可以使用getchar()函数,对于本题的读取会更加清晰一些。
C代码展示:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
for (int i=0; i<n; i++){
char x;
float h;
scanf("\n%c %f", &x, &h); //每次输入时,在缓存区都还有一个\n,故需要吃掉\n。
if (x == 'M') printf("%.2f\n", h / 1.09);
else printf("%.2f\n", h * 1.09);
}
return 0;
}