目录
1.No Hello World!
没有坑,直接输出 Hello SYUCT-ACM! 就OK了。
AC code
#include<stdio.h>
int main(){
printf("Hello SYUCT-ACM!");
return 0;
}
2.No Hello World 2
题目要求输出带双引号的的 “Hello SYUCT-ACM!” ,有坑,需要了解下转义字符(如下):
1.转义字符用来表示C语言字符串和字符常量的一些特殊字符,必须用转义方式才能避免和C语言语法冲突,常用的大小写字母和数字、标点符号不需要转义。
2.初学者经常会问如何输出换行符、字符串空终止符如何表示、如何输出单引号和双引号。
这都需要用到转义字符,转义字符都是以反斜杠开头表示。
换行符 | \n |
字符串终止符 | \0 |
单引号 | ' |
双引号 | " |
#include <stdio.h>
int main(void) {
printf("\'"); // 输出单引号
printf("\""); // 输出双引号
printf("\n"); // 输出换行符
// 字符数组存入字符串终止符,表示一个字符串abc
char a[] = {'a','b','c','\0'};
printf("%s\n",a); // 输出字符串abc
return 0;
}
c语言规定的部分常见转义字符
转义序列 描述 表示
\' 单引号 字节 0x27 ( ASCII 编码)
\" 双引号 字节 0x22 ( ASCII 编码)
\? 问号 字节 0x3f ( ASCII 编码)
\\ 反斜杠 字节 0x5c ( ASCII 编码)
\a 响铃 字节 0x07 ( ASCII 编码)
\b 退格 字节 0x08 ( ASCII 编码)
\f 换页 字节 0x0c ( ASCII 编码)
\n 换行 字节 0x0a ( ASCII 编码)
\r 回车 字节 0x0d ( ASCII 编码)
\t 水平制表 字节 0x09 ( ASCII 编码)
\v 垂直制表 字节 0x0b ( ASCII 编码)
AC code
#include<stdio.h>
int main(){
printf("\"Hello SYUCT-ACM!\"");
return 0;
}
3.弹反
题目要求输入一个数 n ,输出 n ,考察最基本的输入输出。
AC code
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
printf("%d", n);
return 0;
}
4.恺撒密码(1)
char类型的字符在计算机中是以ASCII码的形式储存的,如下图:
所以对于字符'a'加1后,实际上是将'a'对应的ASCII码值加1,'a'+1的值为98,对应ASCII码中的'b'。
由于题目明确最后偏移的字符不会超过'z',所以可以直接相加。
AC code
#include<stdio.h>
int main(){
char a; //字符类型变量
int k; //偏移量
scanf("%c%d", &a, &k);
printf("%c", a + k);
return 0;
}
注:若以整数形式输出,则会输出对应的ASCII码,占位符 %d 与 %c 实际相当与一个强制转换。
#include<stdio.h>
int main(){
char a; //字符类型变量
int k; //偏移量
scanf("%c%d", &a, &k);
printf("%d", a + k);
return 0;
}
输入: a 1
输出:98
5.球的体积
如上图公式,在定义变量时要注意尽量使用 double 类型,精度更高,在正常的算法竞赛中基本不会用到 float 。
重点注意!!!
在C语言或者C++中,整型数/整型数=整型数,也就是说很多小伙伴按照上述公式写的代码 4/3 实际上并不等于 1.3333.... 而是等于 1 ,其原因是由前向后 4/3 这一个整体为整数,在计算过程中自动将小数点后的部分舍去了,所以是错误的!!!
可以在公式最前面乘上1.0或者直接写成4.0/3,将这一部分变为实数。
AC code:
#include<stdio.h>
int main(){
double pi = 3.14159, V, r;
scanf("%lf", &r);
V = 1.0*4/3*r*r*r*pi;
printf("%.5lf",V); //注意题目要求,保留5位小数
return 0;
}
6.圆的面积
通过上述公式直接算,注意保留3位小数。
AC code
#include<stdio.h>
int main(){
double pi = 3.14159,S,r;
scanf("%lf", &r);
S = pi * r * r;
printf("%.3lf",S);
return 0;
}
7.A + B problem ll
给出两个数 a,b ,求两数之和,最终结果不足8位在前面补0.
注意数的范围!!!a,b大小已经超过int的范围了,需要用 long long 来储存,否则会出现溢出。
(下附整型数范围表):
十年OI一场空,不开long long见祖宗
对于补0,见讲义C语言入门讲义(竞赛向)-CSDN博客
%0 后接要补零的位数,此题为8位,那就是%08 。
AC code
#include<stdio.h>
int main(){
long long a,b,ans;
scanf("%lld%lld", &a, &b); //注意输入长整数要用 %lld 占位符,否则输入不进去。
ans = a + b;
printf("%08lld",ans);
return 0;
}
8.柔柔学姐的平均分
输入三个正整数,a,b,c,输出它们的平均数,结果保留两位小数。
如何计算见 5.球的体积 ,原理是一样的。
AC code
#include<stdio.h>
int main() {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
double ans;
ans = 1.0*(a+b+c)/3;
printf("%.2lf",ans);
return 0;
}
9.六芒星
直接复制粘贴,注意空格个数和换行符。
空格和换行符都要在 printf 的双引号中!
AC code
#include<stdio.h>
int main(){
printf(" ******\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf("* *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" ******\n");
return 0;
}
10.一个数? OR 三个数?
- 求一个数的个位数方法是:n%10;
- 求一个数的十位数的方法是:(n/10)%10;
- 求一个数的百位方法是:(n/100)%10。
由此我们可以发现,我们是从最低位(个位)开始求的,每次求一个数的个位数用n%10后,要向前一位求取这个位的数,所以n/10往前进一位,那么进两位就n/100,进三位就是n/1000以此类推。
对于该题,只有三位数,可以设置三个变量来分别储存三个位数。
AC code
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
int a,b,c;
a = n % 10; // 取个位
n = n /10; // 舍弃个位,变为两位数
b = n % 10; // 取十位
n = n / 10; // 舍弃十位,变为一位数
c = n; // 当前值为一位数,就是原数的百位
printf("%d",a+b+c);
return 0;
}
11.舰长的奇妙冒险1
题目考察 if 判断语句,三个判断,并且都有嵌套判断。
- 当 x = 1 时,进行加减运算,输入 a, op, b,其中a和b 为正整数,op 为加号或减号
- 判断 op 的符号类型,加号输出 a+b ,减号输出 a-b 。
- 当 x = 2 时,进行乘除运算,输入 a, op, b,其中a和b 为正整数,op 为乘号或除号
- 判断 op 的符号类型,乘号输出 a*b ,减号输出 a/b ,注意要保留两位小数。将整数转换成小数进行除法的运算见 5.球的体积。
- 当 x = 3 时,输入一个正整数 n ,判断其是年份否为闰年。
- 若是闰年输出"YES",否则输出"NO"。
闰年判断
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
重要结论,需要记住,满足以下条件的是闰年
n%4==0&&n%100!=0||n%400==0
AC code
#include<stdio.h>
int main() {
int x;
int a, b;
char op;
scanf("%d", &x);
if(x == 1) {
scanf("%d%c%d", &a, &op, &b);
if(op == '+') {
printf("%d", a + b);
}else{
printf("%d", a - b);
}
}else if(x == 2) {
scanf("%d%c%d", &a, &op, &b);
if(op == '*') {
printf("%.2lf", 1.0 * a * b);
}else {
printf("%.2lf", 1.0 * a / b);
}
}else {
int n;
scanf("%d", &n);
if(n%4 == 0 && n%100 != 0 || n%400 == 0) {
printf("YES");
}else{
printf("NO");
}
}
return 0;
}
注:对于 for 循环,while 循环,以及 if 判断 ,若不用大括号表示作用域,则默认作用域到下一个语句结束,例如本题代码可以简写成:
#include<stdio.h>
int main() {
int x;
int a, b;
char op;
scanf("%d", &x);
if(x == 1) {
scanf("%d%c%d", &a, &op, &b);
if(op == '+')
printf("%d", a + b);
else
printf("%d", a - b);
}else if(x == 2) {
scanf("%d%c%d", &a, &op, &b);
if(op == '*')
printf("%.2lf", 1.0 * a * b);
else
printf("%.2lf", 1.0 * a / b);
}else {
int n;
scanf("%d", &n);
if(n%4 == 0 && n%100 != 0 || n%400 == 0)
printf("YES");
else
printf("NO");
}
return 0;
}
12.恺撒密码(2)
给定一个小写字母 c,和一个整数偏移量 k,要求对字母 c 进行偏移加密。如果字母偏移超过了字母 'z',则从 'a' 开始继续。
- 在计算机中,每个字符都有对应的 ASCII 码。小写字母 'a' 到 'z' 的 ASCII 码范围是 97 到 122。凯撒密码加密的原理就是将字母的 ASCII 码值进行偏移。
- 如果字母加密后超过 'z'(即超过了 ASCII 值 122),就要从 'a' 重新开始,这可以通过取模运算实现。
假设 c 是要加密的字母,k 是偏移量:
- 先将字母 c 转换为 0 到 25 的范围,用 c - 'a' 实现。
- 然后进行偏移 (c - 'a' + k),再对 26 取模,确保超出 'z' 后从 'a' 开始。(有点数学思想)
- 最后将结果加回 'a',得到偏移后的字母。
AC code
#include<stdio.h>
int main() {
int k;
char c;
scanf("%c%d", &c, &k);
k = k % 26;
if(c+k > 'z'){
printf("%c", c-26+k);
}else{
printf("%c", c+k);
}
return 0;
}
13.柔柔学姐买饭
- 柔柔学姐有 x 角,一个包子要 15 角,问柔柔学姐可以买几个包子,这样问就好理解了。
- 由于整数相除直接向下取整,所以不用考虑小数的问题了,直接除就可以。
AC code
#include<stdio.h>
int main() {
int a,b;
scanf("%d%d", &a, &b);
a=a*10+b;
printf("%d", a/15);
return 0;
}
14.原神启动(1)
- 据题意,如果 n >= 80 输出 "YES"。
- 如果 n>=70&&n<80 输出要删除多大空间让空间到 80 ,即 80-n 。
- 如果 n<70 直接输出 "NO"。
AC code
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
if(n >= 80) {
printf("YES");
} else if(n>=70&&n<80) {
printf("%d", 80-n);
}else{
printf("NO");
}
return 0;
}
15.依然刁德堡
- 输入三个数 a, b, c 表示有多少钱,加在一起总共有 n 元。
- 当 n >=14 时,学长买的起猪脚饭,输出 "Yes" 。
- 当 n>=16 时,学长加的起肉,输出 "依然刁德堡"。
- 当 n>=14 && n<16 时,学长加不起肉,输出 "ono"。
- 当 n<14 时,学长啥都买不起,,在第一行输出 "No",第二行输出 "ono"。
AC code
#include<stdio.h>
int main(){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
int n = a + b * 5 + c * 10;
if(n >= 14){
printf("YES\n");
if(n >= 16){
printf("依然刁德堡");
}
else printf("ono");
}
else{
printf("NO\n");
printf("ono");
}
return 0;
}
16.柔柔不会排
本题要求对输入的三个整数 a, b, c 进行排序并输出。从题目描述可以看出,题目希望将三个整数按照从小到大的顺序进行排列。由于只有三个数字,排序的方法可以非常简单,例如通过直接比较和交换。
比较 a 和 b :
- 如果 a > b,则交换 a 和 b,保证此时 a <= b。
比较 a 和 c:
- 如果 a > c,则交换 a 和 c,保证此时 a <= c。
比较 b 和 c:
- 如果 b > c,则交换 b 和 c,保证 b <= c。
经过这些比较和交换后,三个数字就按照从小到大的顺序排好了。
AC code
#include<stdio.h>
int main(){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(a > b){
int t = a;
a = b;
b = t;
}
if(a > c){
int t = a;
a = c;
c = t;
}
if(b > c){
int t = b;
b = c;
c = t;
}
printf("%d %d %d", a, b, c);
return 0;
}
17.鸡兔不同笼问题
由题得,有 2*a 个鸡爪,b 个兔头
当鸡爪数量大于兔头时,输出"YES"。
当鸡爪数量小于兔头时,输出"NO",并且输出差几只鸡。
很简单想到,兔头与鸡爪的差除2为还差鸡的数量,但一只鸡只有两个鸡爪,当差值为奇数时,直接除以 2 会使答案少1,所以要提前加1 。
AC code
#include<stdio.h>
int main(){
int a, b;
scanf("%d%d", &a, &b);
if(2 * a >= b){
printf("YES");
}else{
printf("NO %d", (b-2*a+1)/2);
}
return 0;
}
18.一元二次方程
判别式:
- 当
>0 ,并且 a!=0 时,有两个根
- 当
=0 ,或者 a=0 时,有一个根
- 当
<0 ,没有根
AC code
#include<stdio.h>
int main(){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
int d = b*b-4*a*c;
if(d>0&&a!=0){
printf("2");
}else if(d==0||a==0){
printf("1");
}else{
printf("0");
}
return 0;
}
19. 魔法符号的秘密
这道题给出的是一个简单的运算判断问题,我们需要判断给定的算式是否成立。题目要求根据输入的运算符号 + , - , * , / , 来执行相应的运算,然后判断结果是否等于第三个数 c。如果等于,则输出 "Yes" 并显示算式;如果不等于,则输出 "No"。
特别需要注意的是,除法 / 在这道题中要求是 向下取整 的,不需要再转化实数,直接除就可以了。
1. 首先,我们要读取一个字符 m 代表运算符,以及三个整数 a, b, c。
2.根据不同的运算符( +, -, *, / ),进行相应的运算,并将计算结果与 c 进行比较。3. 输出结果:
- 如果结果相等,输出 "Yes" 并按照指定格式打印算式。
- 如果结果不相等,直接输出 "No"。
AC code
#include<stdio.h>
int main() {
char m;
int a, b, c;
scanf(" %c %d %d %d", &m, &a, &b, &c);
if (m == '*') { // 乘法
if (a * b == c) {
printf("Yes\n%d%c%d=%d", a, m, b, c);
} else {
printf("No");
}
}
else if (m == '+') { // 加法
if (a + b == c) {
printf("Yes\n%d%c%d=%d", a, m, b, c);
} else {
printf("No");
}
}
else if (m == '-') { // 减法
if (a - b == c) {
printf("Yes\n%d%c%d=%d", a, m, b, c);
} else {
printf("No");
}
}
else if (m == '/') { // 除法
if (a / b == c) {
printf("Yes\n%d%c%d=%d", a, m, b, c);
} else {
printf("No");
}
}
return 0;
}
20.Genshin Impact Start !
本题为模拟
先输入三行三列行列式
再计算每个元素所对应的余子式
然后找到余子式之和最大的那一行,求得三个余子式的积
如果这个积是一个正奇数,则输出它,否则输出 -1 。
AC code
#include <stdio.h>
int main(){
int a, b, c, d, e, f, g, h, i;
int A, B, C, D, E, F, G, H, I;
int l1, l2, l3;
int ans;
scanf("%d %d %d", &a, &b, &c);
scanf("%d %d %d", &d, &e, &f);
scanf("%d %d %d", &g, &h, &i);
//算余子式
A = e * i - h * f;
B = d * i - g * f;
C = d * h - g * e;
D = b * i - h * c;
E = a * i - g * c;
F = b * i - h * c;
G = b * f - e * c;
H = a * f - d * c;
I = a * e - d * b;
//算余子式之和
l1 = A + B + C;
l2 = D + E + F;
l3 = G + H + I;
//找最大余子式之和
int max;
if(l1 >= l2 && l1 >= l3) {
max = A * B * C;
}else if(l2 >= l1 && l2 >= l3) {
max = D * E * F;
}else{
max = G * H * I;
}
if(max % 2 != 1){
ans = -1;
}
printf("%d", ans);
return 0;
}
21.Hello,Hello world
考察转义字符,见 2.No Hello World 2 。
AC code
#include<stdio.h>
int main(){
printf("#include<stdio.h>\n");
printf("int main(){\n");
printf(" printf(\"Hello world!\\n\");\n");
printf(" return 0;\n");
printf("}");
return 0;
}
22.舰长的奇妙冒险2
异或运算,和加分减法运算类似,运算符号再键盘数字键 '6' 的上标 '^'。
- 异或运算满足以下性质:
- 1. 异或运算满足交换律和结合律:a^b^c = a^c^b
- 2. 任何数和0进行异或运算,结果还是这个数本身:a^0 = a
- 3. 任何数和自身进行异或运算,结果是0:a^a = 0
- 4. 异或运算是可逆的,即对一个数进行两次异或同一个数,结果还是这个数本身:a^b^b = a
本题直接输出三个数的异或和即可
AC code
#include <stdio.h>
int main(){
int a,b,c;
scanf("%d%d%d", &a, &b, &c);
int ans = a ^ b ^ c;
printf("%d", ans);
return 0;
}
23.problem6
如题,关于补零见 7.A + B problem ll ,使用 %0nd 占位符来输出,n 为补零的个数。
AC code
#include <stdio.h>
int main(){
int n;
scanf("%d",&n); // 不要在scanf里面加 %0
printf("%04d",n);
return 0;
}