2021-10-28计科ACM新生培训题解

这次培训我们讲了函数相关知识
相信大家已经掌握牢固
在这里插入图片描述

如果没有掌握牢固的可以再看一下相关知识概念
函数相关概念
下面开始题解部分

题解

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;
}

讲解完毕,感谢大家观看
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值