第二十二周代码(跟着罗勇军老师刷题 + java + 竞赛实践)

2024/03/11        周一

P1226 【模板】快速幂

题目链接

【参考代码】

#include <bits/stdc++.h>
using namespace std;

int a, b, p;

// 快速幂算法,计算 (a^b) % p
long long fastpow(int a, int exponent, int p)
{
    if(exponent == 0)
        return 1; // 如果指数为0,返回1
    if(exponent == 1)
        return a % p; // 如果指数为1,返回a % p
    // 递归调用fastpow函数,将指数b除以2
    long long temporary = fastpow(a, exponent/2, p);
    if(exponent%2 == 0)
        return temporary % p * temporary % p; // 如果指数b是偶数,返回temp^2 % p
    else
        return temporary % p*temporary % p*a % p; // 如果指数b是奇数,返回temp^2 * a % p
}

int main()
{
    cin>>a>>b>>p; // 输入a、b和p的值
    cout<<a<<'^'<<b<<" mod "<<p<<'='<< fastpow(a,b,p) <<endl; // 输出结果
}

P1036 [NOIP2002 普及组] 选数

题目链接

【参考代码】

#include <iostream>
using namespace std;

// 全局变量,所有函数可以调用
int n, k, ans; // n表示数组的长度,k表示子集中元素的数量,ans表示满足条件的子集数量
int arr[10] = { 0 }; // 存储输入的数组元素

// 判断一个数是否为质数
int isPrime(int n)
{
    for (int i = 2; i < n / 2; i++)
    {
        if (n % i == 0)
            return 0; // 如果存在除1和自身之外的因子,则不是质数
    }
    return 1; // 否则是质数
}

// 深度优先搜索函数
void dfs(int start, int count, int sum) {
    if (count == k && isPrime(sum)) {
        ans++; // 如果当前子集的元素数量等于k且子集元素之和为质数,则满足条件,将答案加1
    }
    for (int i = start; i < n; i++)
        dfs(i + 1, count + 1, sum + arr[i]); // 下一层,递归地搜索下一个元素,更新子集的元素数量和元素之和
}

int main()
{
    cin >> n >> k; // 输入数组长度和子集元素数量
    for (int i = 0; i < n; i++)
        cin >> arr[i]; // 输入数组元素
    dfs(0, 0, 0); // 从第一个元素开始进行深度优先搜索
    cout << ans << endl; // 输出满足条件的子集数量
}

2024/03/12        周二

B3871 [GESP202309 五级] 因数分解

题目链接

【参考代码】

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// input:999999999999
// ouput:3^3 * 7 * 11 * 13 * 37 * 101 * 9901
// 要这种形式
int main()
{
    ll n;
    cin >> n; // 输入要分解的整数n
    for (int i = 2; i <= sqrt(n); i++) // 从2开始遍历到sqrt(n),因为大于sqrt(n)的因子已经被前面的小因子覆盖了
    {
        int count = 0; // 记录当前素数因子的指数, 找了第一个素数之后要归零
        if (n % i == 0) // 如果i是n的因子
        {
            while (n % i == 0) // 计算i的指数
            {
                n /= i; // 将n除以i
                count++; // 指数加1
            }
            if (count > 1) // 如果指数大于1,输出i^count
                cout << i << '^' << count;
            else // 如果指数等于1,直接输出i
                cout << i;
            if (n > 1) // 如果n还有剩余的因子,输出乘号
                cout << " * ";
        }
    }
    if (n > 1) // 如果n最后剩余的因子大于1,输出该因子
        cout << n << endl;
}

2024/03/13        周三

java实验——继承

实验内容及要求:

1:使用继承构造动物类、猫类、狗类,自行设计每个类的成员属性、构造方法和成员方法,输出具有继承关系的类的属性和方法调用,分析它们的关系和运行逻辑

class Animal{
	//成员属性:年龄,体重,物种
	String species;
	int age;
	int weight;
	//构造方法
	public Animal()
	{
		super();
	}
	public Animal(String species, int age, int weight)
	{
		this.species = species;
		this.age = age;
		this.weight = weight;
	}
	//成员方法
	public void eat()
	{
		System.out.println(this.species + "在吃饭");
	}
	public void sleep()
	{
		System.out.println(this.species + "在睡觉");
	}
}

class Cat extends Animal{
	//成员属性:性别,毛色
	String sex;
	String hairColor;
	//构造方法:
	public Cat()
	{
		super();
	}
	public Cat(String sex, String hairColor, String species, int age, int weight)
	{
		super(species, age, weight);
		this.sex = sex;
		this.hairColor = hairColor;
	}
	//成员方法
	public void speak()
	{
		System.out.println("喵喵喵");
	}
	String getCatSex()
	{
		return this.sex;
	}
	String getHairColor()
	{
		return this.hairColor;
	}
}

class Dog extends Animal{
	//成员属性:性别,毛色
	String sex;
	String hairColor;
	//构造方法:
	public Dog()
	{
		super();
	}
	public Dog(String sex, String hairColor, String species, int age, int weight)
    {
        //super("狗", 2, 10);
		super(species, age, weight);
        this.sex = sex;
        this.hairColor = hairColor;
    }	
	//成员方法
	public void speak()
	{
		System.out.println("汪汪汪");
	}
	String getDogSex()
	{
		return this.sex;
	}
	String getHairColor()
	{
		return this.hairColor;
	}
}

public class TheFirstQuestion {
	public static void main(String[] args) {
		Cat cat = new Cat("雄性", "花色", "猫", 3, 8); //创建对象
		cat.eat(); //猫在吃饭
		cat.sleep(); //猫在睡觉
		cat.speak(); //喵喵喵
		System.out.println(cat.getCatSex()); //雄性
		System.out.println(cat.getHairColor()); //花色
		
		Dog dog = new Dog("雌性", "白色", "狗", 2, 10);
        dog.eat(); // 狗在吃饭
        dog.sleep(); // 狗在睡觉
        dog.speak(); // 汪汪汪
        System.out.println(dog.getDogSex()); // 雌性
        System.out.println(dog.getHairColor()); // 白色
	}
}

程序运行结果:

2024/03/15        周五

hdu 1312 Red and Black

【参考代码】

#include <bits/stdc++.h>
using namespace std;

char room[4][5] = {  //地图
    {'.', '.', '.', '.', '#'},
    {'.', '.', '.', '.', '.'},
    {'#', '@', '.', '.', '.'},
    {'.', '#', '.', '.', '#'},
};

int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};  //定义四个方向的偏移量
int StepCount = 0, XMax=3, YMax=4;  //步数计数器和地图边界

struct node{  //定义节点结构体,包含x和y坐标
    int x;
    int y;
};

void bfs(int StartX, int StartY)  //广度优先搜索函数,传入起始点的坐标
{
    StepCount = 1;  //初始化步数计数器为1
    queue<node> q;  //定义队列用于存储待处理的节点
    node start, next;  //定义当前节点和下一个节点
    start.x = StartX;  //设置起始节点的x坐标
    start.y = StartY;  //设置起始节点的y坐标
    q.push(start);  //将起始节点加入队列
    while(!q.empty())  //当队列不为空时循环
    {
        start = q.front();  //取出队列中的第一个节点作为当前节点
        q.pop();  //从队列中移除当前节点
        for(int i=0;i<4;i++)  //遍历四个方向
        {
            next.x = start.x + dx[i];  //计算下一个节点的x坐标
            next.y = start.y + dy[i];  //计算下一个节点的y坐标
            if(room[next.x][next.y] == '#' || room[next.x][next.y] == '@' || next.x < 0 || next.x > XMax || next.y < 0 || next.y > YMax)  //判断下一个节点是否越界或被访问过
                continue;  //如果越界或已访问,跳过当前方向
            room[next.x][next.y] = '#';  //标记下一个节点为已访问
            StepCount++;  //步数计数器加1
            q.push(next);  //将下一个节点加入队列
        }
    }
}

int main()
{
    int startx = 2, starty = 1;  //设置起始点的坐标
    bfs(2, 1);  //调用广度优先搜索函数
    cout << StepCount << endl;  //输出步数计数器的值
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值