L1-025 正整数A+B
题目内容:
解题思路:
本题注意点较多并且比较分散,我针对我完成时注意到的一些点来进行分享。
注意点1.A、B的值在范围 [1, 1000],需要注意 >=1000 和 == 0 的情况。
注意点2.多空格的判定,即用gets这类整行读取时需要注意判定,以及scanf的不适合单独使用。
注意点3.非数字字符的判定,这个较为容易。
C代码展示:
#include <stdio.h>
#include <string.h>
int main() {
char A[1000], B[1000];
int _A = 0, _B = 0, flag = 0;
scanf("%s", A);
gets(B);
for (int i = 0; i < strlen(A) && flag == 0; i++) { // 遍历字符串A中的每个字符
if ('0' <= A[i] && A[i] <= '9') {
_A = _A * 10 + A[i] - '0'; // 将字符转换为整数并添加到_A中
} else {
flag += 1; // 如果遇到非数字字符,设置标志1
}
if (_A > 1000 || _A == 0 && flag == 0) flag += 1;
// 如果_A超出范围或在处理完字符串A之前发现无效输入,设置标志1
}
for (int i = 1; i < strlen(B) && flag <= 1; i++) { // 从第二个字符开始遍历字符串B,因为第一个字符可能不是数字
if ('0' <= B[i] && B[i] <= '9' && _B <= 1000) { // 如果字符是数字且_B在有效范围内
_B = _B * 10 + B[i] - '0'; // 将字符转换为整数并添加到_B中
} else {
flag += 2; // 如果遇到非数字字符,设置标志2
}
if (_B > 1000 || _B == 0 && flag <= 1) flag += 2;
// 如果_B超出范围或在处理完字符串B之前发现无效输入,设置标志2
}
if (flag == 0) { // 如果没有错误标志
printf("%d + %d = %d\n", _A, _B, _A + _B); // 输出加法表达式的结果
} else if (flag == 1) { // 如果只有第一个数字有错误
printf("? + %d = ?\n", _B); // 输出包含问号的加法表达式
} else if (flag == 2) { // 如果只有第二个数字有错误
printf("%d + ? = ?\n", _A); // 输出包含问号的加法表达式
} else if (flag == 3) { // 如果两个数字都有错误
printf("? + ? = ?\n"); // 输出包含问号的加法表达式
}
return 0;
}
L1-026 I Love GPLT
题目内容:
解题思路:
略。
C代码展示:
#include <stdio.h>
int main()
{
printf("I\n \nL\no\nv\ne\n \nG\nP\nL\nT\n");
return 0;
}
L1-027 出租
题目内容:
解题思路:
本题对时间的要求较低,只要能写出来就可以,整体难度我认为不如L1-025。
我的处理方法是,使用三个数组,tell,temp,arr。tell用来存储电话号码,temp用哈希表的方式来临时记录出现过的数,arr用来记录最终的数字顺序。
C代码展示:
#include <stdio.h>
int main() {
int tell[20], temp[20] = {0}, arr[20] = {0};
int k = 0;
for (int i = 0; i < 11; i++) { // 循环读取11个整数
scanf("%1d", &tell[i]); // 读取一个整数并存储在tell数组中
temp[tell[i]]++; // 在temp数组中,对应tell[i]的计数加1
}
for (int i = 9; i >= 0; i--) { // 从大到小遍历temp数组
if (temp[i]) { // 如果temp[i]不为0,说明有数字i
arr[k] = i; // 将数字i存储到arr数组中
k++; // 增加arr数组的计数
}
}
printf("int[] arr = new int[]{");
for (int i = 0; i < k - 1; i++) printf("%d,", arr[i]);
printf("%d};\n", arr[k - 1]);
printf("int[] index = new int[]{");
for (int i = 0; i < 10; i++) {
for (int j = 0; j < k; j++) {
if (tell[i] == arr[j]) printf("%d,", j);
}
}
for (int j = 0; j < k; j++) {
if (tell[10] == arr[j]) printf("%d};\n", j);
}
return 0;
}
L1-028 判断素数
题目内容:
解题思路:
分开处理正整数 1 和 2 ,其余数就按照正常的素数判断方法。
注意,需要用sqrt来缩短时间。
C代码展示:
#include <stdio.h>
#include <math.h>
int main()
{
int n, a, flag = 0;
scanf("%d", &n);
for (int i=0; i<n; i++){
scanf("%d", &a);
flag = 0;
if (a <= 1) printf("No\n");
else if (a == 2) printf("Yes\n");
else{
for (int j=2; j<sqrt(a) + 1 && flag == 0; j++){
if (a % j == 0){
flag = 1;
}
}
if (flag == 0) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}
L1-029 是不是太胖了
题目内容:
解题思路:
略。
C代码展示:
#include <stdio.h>
int main()
{
int H;
scanf("%d",&H);
printf("%.1f\n",(H-100)*0.9*2);
return 0;
}
L1-030 一帮一
题目内容:
解题思路:
由于题目规定男女人数一样,故上半部分 的互帮对象一定会在 下半部分,按照这个思路,只需要从数组的两头进行查询即可,然后对查询过的数据的首位进行修改标记。
注意点:如果N是用scanf输入,会遗留一个 "\n" 需要用 getchar() 给它囊括掉,才会不影响后续gets()这类函数的使用。
C代码展示:
#include <stdio.h>
#include <string.h>
int main() {
int n;
char s[100][50] = {{0}};
scanf("%d", &n); // 读取字符串的数量
getchar(); // 读取并丢弃缓冲区中的换行符
for (int i = 0; i < n; i++) gets(s[i]); // 使用gets函数读取每个字符串。
for (int i = 0; i < n / 2; i++) { // 遍历字符串数组的前半部分
if (s[i][0] == '0') { // 如果字符串以'0'开头
for (int j = n; j >= n / 2; j--) { // 从后半部分的字符串开始遍历
if (s[j][0] == '1') { // 如果找到以'1'开头的字符串
printf("%s %s\n", s[i] + 2, s[j] + 2); // 输出配对的字符串(跳过前两个字符)
s[j][0] = '2'; // 将配对成功的字符串标记为'2'
break; // 跳出循环
}
}
} else { // 如果字符串不是以'0'开头
for (int j = n; j >= n / 2; j--) { // 从后半部分的字符串开始遍历
if (s[j][0] == '0') { // 如果找到以'0'开头的字符串
printf("%s %s\n", s[i] + 2, s[j] + 2); // 输出配对的字符串(跳过前两个字符)
s[j][0] = '2'; // 将配对成功的字符串标记为'2'
break; // 跳出循环
}
}
}
}
return 0;
}
L1-031 到底是不是太胖了
题目内容:
解题思路:
主要是读懂题中三个分类的标准,以及整型和浮点型的转换。
建议1:对于公斤和市斤的转换可以在标准体重处进行,将公斤转换为市斤。
建议2:判断是否完美时,因为有浮点型进行运算,可以用fabs函数来取绝对值。
C代码展示:
#include <stdio.h>
#include <math.h>
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int h, w; // 定义变量h(身高)和w(体重)
float _bz; // 定义变量_bz,用于存储标准体重
if (i) printf("\n"); // 如果不是第一组数据,输出一个换行符
scanf("%d %d", &h, &w); // 读取身高和体重
_bz = (h - 100) * 0.9 * 2; // 计算标准体重,公式为:标准体重 = (身高 - 100) * 0.9 * 2
if (0 < w - _bz && w - _bz >= _bz * 0.1) { // 如果实际体重大于标准体重,并且差距大于等于标准体重的10%
printf("You are tai pang le!");
}
if (0 < _bz - w && _bz - w >= _bz * 0.1) { // 如果实际体重小于标准体重,并且差距大于等于标准体重的10%
printf("You are tai shou le!");
}
if (fabs(w - _bz) < _bz * 0.1) { // 如果实际体重与标准体重的差距小于标准体重的10%
printf("You are wan mei!");
}
}
return 0;
}
L1-032 Left-pad
题目内容:

解题思路:
本题主要分为两种情况:
一、输入字符串长度 <= 填充结果字符串,对于这种情况,就需要先用一个循环输出填充字符,再输出字符串。
二、输入字符串长度 > 填充结果字符串,这时就可以通过指针移动到填充字符串长度的地方,也即str + len - n。
C代码展示:
#include <stdio.h>
#include <string.h>
int main() {
int n, len; // 定义整数变量n(用于存储用户输入的长度)和len(用于存储字符串实际长度)
char c; // 定义字符变量c,用于存储用户输入的特定字符
char str[100005] = {0}; // 定义一个字符数组str,用于存储输入的字符串,初始化为0
scanf("%d %c", &n, &c); // 读取用户输入的长度和特定字符
getchar(); // 读取并丢弃缓冲区中的换行符,为gets函数做准备
gets(str); // 使用gets函数读取一行字符串。
len = strlen(str); // 计算输入字符串的实际长度
if (len <= n) { // 如果字符串长度小于或等于用户输入的长度
for(int i = 0; i < n - len; i++) { // 循环输出特定字符,直到达到用户输入的长度
printf("%c", c); // 输出特定字符
}
printf("%s\n", str); // 输出原始字符串
} else { // 如果字符串长度超过用户输入的长度
printf("%s\n", str + len - n); // 输出字符串的后n个字符
}
return 0;
}