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