这次培训我们讲了函数相关知识
相信大家已经掌握牢固
如果没有掌握牢固的可以再看一下相关知识概念
函数相关概念
下面开始题解部分
题解
A 我知道你们这道题都会了
传送门
你们确实会了,但大多数同学都没运用本节课学习的函数
本嘉心糖很失望!!!!
AC代码:
#include <stdio.h>
int x;
void solve()
{
if (x > 0)
printf("%d", x + 1);
else if (x == 0)
printf("0");
else
printf("%d", x - 1);
}
int main()
{
scanf("%d", &x);
solve();
return 0;
}
B 嘉然吃嘉心糖
没想到这题之前比赛你们也做过…
传送门
AC代码:
#include <stdio.h>
int x, ans = 1;
void solve()
{
for (int i = 1; i < x; i++)
{
ans += 1;
ans *= 2;
}
printf("%d\n", ans);
}
int main()
{
scanf("%d", &x);
solve();
return 0;
}
C 圣嘉然尝试学数学!
解题思路:循环暴力跑先找出构成这个数的因子,并判断这个因子是不是质数。知道找到最小的质因子,然后拿这个数去除以这个最小质因子就获得最大质因子了
传送门
AC代码:
#include <bits/stdc++.h>
int main()
{
int n;
scanf("%d", &n);
for (int i = 2; i <= n; i++)
if (n % i == 0)
{
printf("%d", n / i);
break;
}
return 0;
}
D 接着冒泡
传送门
解题思路:一道简单的冒泡排序水题,冒泡,冒泡,就和水杯里的气泡一样
一个个跑到最上面,可以用每一个数去和其他所有的数比较,然后让他交换到他所能达到的最终位置。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,t,cnt=0,tot=0;
long long a[100005];
void da(int l,int r){
for(int i=l;i<=r;i++){
for(int j=l;j<=r;j++){
if(a[i]<a[j]){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
void xiao(int l,int r){
for(int i=l;i<=r;i++){
for(int j=l;j<=r;j++){
if(a[i]>a[j]){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
int main() {
int l,r,k;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
while(m--){
scanf("%d%d%d",&l,&r,&k);
if(k==1){
xiao(l,r);
}else{
da(l,r);
}
}
for(int i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}
E 拿硬币游戏
传送门
解题思路:
AC代码:
#include <stdio.h>
int t, n;
//首先是 0 先手就拿不了了,所以先手输,再是 1 2 先手能直接拿完先手赢
//然后就是n>=3的情况,我们可以想 在这种情况下
//先手拿必定会将这个环断开成一条线,那么后手的人必定能将这个线分成等
//量的两根线(线是奇数在中间拿一个,偶数在中间拿两个),在此之后先手
//的人能拿的话,后手也能拿(模仿先手拿即可,比如先手在一堆拿一个或两
//个,那么后手在另一堆的相同位置拿相同的数量),所以最后先手必定会输
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
if (n == 1 || n == 2)
printf("fcx\n");
else
printf("czq\n");
}
return 0;
}
F 特殊的素数
传送门
AC代码:
#include <stdio.h>
int a, b, flag;
//将一个数反序: 每次取出原数最后一位加在反序数的后面,然后将原数最后一位删去。
int fanxu(int x)
{
int t = 0;
while (x)
{
t = t * 10 + x % 10;
x /= 10;
}
return t;
}
//首先注意 1 的情况 然后是枚举到 x-1 的话 可能超时
//我们可以想对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,
//那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),所以只需枚举到
//sqrt(n)就可以了 这样能在判断的数是素数是大量省时间
int panduan(int x)
{
if (x == 1)
return 0;
for (int i = 2; i <= x / i; i++) //注意如果不用sqrt 最好不要写成 i*i<=x 因为i是int的话i*i会炸
if (x % i == 0)
return 0;
return 1;
}
int main()
{
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++)
if (panduan(i) && panduan(fanxu(i)))
{
if (flag) //flag不为0则不是第一个前面加,
printf(",%d", i);
else
printf("%d", i);
flag++;
}
if (!flag) //到最后flag为0 证明a到b没有 输出No
printf("No");
return 0;
}
讲解完毕,感谢大家观看