字母转换大小写:

1
a - 'a' + 'A';

花费的时间向上取整技巧:

1
2
//s是路程,v是速度
t = (s + v - 1) / v;

最大公约数/约分问题*:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 辗转相除法求最大公约数
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}

int main() {
int numerator, denominator;
printf("请输入分子和分母:");
scanf("%d %d", &numerator, &denominator);

int divisor = gcd(numerator, denominator);

// 约分
numerator /= divisor;
denominator /= divisor;

printf("约分后的结果为:%d/%d\n", numerator, denominator);
return 0;
}

字符数字转换整型数字做运算

通过将字符 '0' (其ASCII值为48) 从字符数字 (例如 '1', 其ASCII值为49) 中减去,从而得到相应的整型数字值。例如,'1' - '0' 会得到整数值 1'2' - '0' 会得到 2

检查质数

从2开始检查,只需要检查到平方根(如果一个数n不是质数,那么它一定可以分解为 n = a × b,a 和 b 中至少有一个小于或等于 √n)

1
2
3
4
5
6
7
int isPrime(int n) {
if (n < 2) return 0; // 小于2的数不是质数
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return 0; // 如果能被整除,就不是质数
}
return 1; // 是质数
}

位移26字母

1
psw[i] = 'a' + (psw[i] - 'a' + n) % 26;

假设我们要把字母 ‘c’ 往后移动 3 位:

  1. psw[i] - 'a'
    
    1
    2
    3
    4
    5
    6
    7

    - 把字母转换成 0-25 的数字
    - 比如 'c' - 'a' = 2,因为 'c' 是字母表中的第3个字母(从0开始数)
    - 这样做的原因是为了方便计算

    2. ```
    (psw[i] - 'a' + n)
    - 在上一步的结果上加上位移量n - 例如:2 + 3 = 5 - 这表示从字母表开始数5个位置
  2. % 26
    
    1
    2
    3
    4
    5
    6
    7
    8

    - 取模运算确保结果在0-25之间
    - 如果结果超过25就会回到开头
    - 比如如果结果是26,取模后变成0
    - 这就实现了字母表的循环效果

    4. ```
    'a' +
    - 最后加上'a'的ASCII值 - 把0-25的数字转回字母 - 比如 'a' + 5 = 'f' ​

处理不要的字符,持续读取直到结束

getchar() 函数每次调用会读取输入流中的一个字符。

1
2
3
4
5
6
7
8
9
10
11
12
//利用getchar()可以处理不需要的字符
//对于一串输入,可以在线处理,持续读取字符直到EOF
//输入一个PASCAL语句:a:= [value];
while ((ch = getchar()) != EOF){
...
// 跳过":="
getchar(); // 跳过:
getchar(); // 跳过=
...
// 跳过分号
getchar();
}

读取一篇文章

1
2
3
4
5
6
7
8
9
while ((c = getchar()) != '\n' && c != EOF);//清除缓冲区

if (fgets(content, sizeof(content), stdin) == NULL) {
// 输入错误处理
// 如果文章为空,直接输出 -1
printf("-1\n");
return 0;
}
content[strcspn(content, "\n")] = '\0'; //移除可能的换行符