2024级SYUCT-ACM新生第一次训练 题解

目录

1.No Hello World!

AC code

2.No Hello World 2

c语言规定的部分常见转义字符

AC code

3.弹反

AC code

4.恺撒密码(1)

AC code

5.球的体积

重点注意!!! 

AC code:

6.圆的面积

AC code

7.A + B problem ll

AC code

8.柔柔学姐的平均分

AC code

9.六芒星

AC code

10.一个数? OR 三个数?

AC code

11.舰长的奇妙冒险1

闰年判断

AC code

12.恺撒密码(2)

AC code

13.柔柔学姐买饭

AC code

14.原神启动(1)

AC code

15.依然刁德堡

AC code

16.柔柔不会排

AC code

17.鸡兔不同笼问题

AC code

18.一元二次方程

AC code

19. 魔法符号的秘密

AC code

20.Genshin Impact Start !

AC code

21.Hello,Hello world

AC code

22.舰长的奇妙冒险2

AC code

23.problem6

AC code


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' 开始继续。

  1. 在计算机中,每个字符都有对应的 ASCII 码。小写字母 'a' 到 'z' 的 ASCII 码范围是 97 到 122。凯撒密码加密的原理就是将字母的 ASCII 码值进行偏移。
  2. 如果字母加密后超过 '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.一元二次方程

判别式:

  • 当 \Delta>0 ,并且 a!=0 时,有两个根
  • 当 \Delta=0 ,或者 a=0 时,有一个根
  • 当 \Delta<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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值