河工软院女队选拔赛1

A.求a到b之间存在多少个素数

对于这道题, 我们首先来了解一下什么是素数

素数的定义: 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数(质数)

知道了这个定义之后, 我们就可以来进行解题了

将区间端点读入之后, 我们需要依次判断区间内的每一个数是否是素数, 如果是, 则将记录素数个数的变量的值加一

显然, 这道题需要实现两个功能:

1、遍历区间中的每一个数

2、判断这个数是否是素数

AC代码如下

#include <stdio.h>

int main()
{
	int l, r;
	scanf("%d%d",&l,&r);
	
	int ans = 0; //用于记录区间内素数的个数 
	for(int i = l; i <= r; i ++)
	{
		int f = 0; //f用来记录 i 在2到 i - 1之间因数的个数; 
		for(int j = 2; j < i; j ++)
		{
			if(i % j == 0) f ++; 
		}
		
		if(f == 0) ans ++; //若 i 在2到i - 1之间没有因数, 则 i 为质数  
	} 
	
	printf("%d", ans);
	return 0;
}

```
//以下为函数写法
#include <stdio.h>

int is_prime(int x)
{
	for(int i = 2; i < x; i ++)
	{
		if(x % i == 0) return 0; //能被i整除, 说明x不是质数 
	}
	return 1;
}

int main()
{
	int l, r;
	scanf("%d%d",&l,&r);
	
	int ans = 0; //用于记录区间内素数的个数 
	for(int i = l; i <= r; i ++)
	{
		if(is_prime(i)) ans ++; 
	} 
	
	printf("%d", ans);
	return 0;
}

B.从小到大输出三个整数

本题详解见:https://blog.csdn.net/qq_73208522/article/details/132117255 的1022

C.所在年第几天

本题的难点不在于题意的理解, 而在于正确代码的实现

这里我们讲一个易懂思路:

举个栗子: 如果我们读入的月份为12月, 说明前面11个月都已经过完了, 设当前日期为该年的第 x 天

则: x = 前11个月的天数 + 当前日期 (注意闰年的二月有29天)

于是, 我们可以利用switch的特性(如果碰不到break则一直向下执行语句)去实现这个操作, 具体代码实现如下:

#include <stdio.h>
int main()
{
	int y,m,d;
	scanf("%d %d %d",&y,&m,&d);
	switch(m)
	{
		case 12:
			d += 30; // 11月有30天
		case 11:
			d += 31; // 10月有31天
		case 10:
			d += 30; // 9月有30天, 下同理
		case 9:
			d += 31;
		case 8:
			d += 31;
		case 7:
			d += 30;
		case 6:
			d += 31;
		case 5:
			d += 30;
		case 4:
			d += 31;
		case 3:
			if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
			{
				d += 29;
			}else
			{
				d += 28;
			}
		case 2:
			d += 31;
		case 1:
			printf("%d",d);
			break;
	}
	return 0;
}

D.杨辉三角

如图, 杨辉三角第i行共i个数字, 其中最边缘数字为1, 其余数字为其左上方数字与其右上方数字之和

我们可以用二维数组来存储杨辉三角, for循环去遍历设置每一行的值, 对于每行, 其两端的值固定为1, 剩余数字对当前位置的左上方数字与右上方数字求和并赋值即可(设当前数字下标为(i, j), 则其左上方数字下标为(i - 1, j - 1), 右上方数字下标为(i - 1, j))

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);

	int a[35][35];

	int i, h;
	for(i = 0; i < n; i ++)
	{
		a[i][0] = 1;
		a[i][i] = 1;
		for(h = 1; h < i; h ++)
		{
			a[i][h] = a[i - 1][h - 1] + a[i - 1][h];
		}
	}

	for(i = 0; i < n; i ++)
	{
		for(h = 0; h <= i; h ++)
		{
			printf("%-8d",a[i][h]);
		}
		printf("\n");
	}
	
	return 0;
}

一轮再进行下一轮配对。直到所有人都配对成功为止。要求使用循环队列实现。 实现思路: 1. 定义一个循环队列,分别存储男队和女队的队列。 2. 从男队和女队的队头各出一人,配成舞伴,输出配对信息。 3. 如果两队初始人数不等,则较长的那一队中未配对者重新入队,等待下一轮配对。 4. 重复步骤2和步骤3,直到所有人都配对成功为止。 代码实现: ``` #include <iostream> using namespace std; const int MAXSIZE = 100; // 循环队列的最大长度 // 循环队列的定义 template <typename T> class Queue { public: Queue(int size = MAXSIZE) { maxSize = size; front = rear = 0; queue = new T[maxSize]; } ~Queue() { delete[] queue; } bool isEmpty() const { return front == rear; } bool isFull() const { return (rear + 1) % maxSize == front; } bool enqueue(const T& x) { if (isFull()) { return false; } queue[rear] = x; rear = (rear + 1) % maxSize; return true; } bool dequeue(T& x) { if (isEmpty()) { return false; } x = queue[front]; front = (front + 1) % maxSize; return true; } private: T* queue; // 存储队列元素的数组 int front; // 队头指针 int rear; // 队尾指针 int maxSize; // 循环队列的最大长度 }; int main() { Queue<int> maleQueue(10); // 男队列 Queue<int> femaleQueue(10); // 女队列 int maleNum, femaleNum; cout << "请输入男队和女队的人数:" << endl; cin >> maleNum >> femaleNum; // 初始化男队和女队 for (int i = 1; i <= maleNum; i++) { maleQueue.enqueue(i); } for (int i = 1; i <= femaleNum; i++) { femaleQueue.enqueue(i); } // 开始配对 int round = 1; // 记录配对轮数 while (!maleQueue.isEmpty() && !femaleQueue.isEmpty()) { int male, female; maleQueue.dequeue(male); femaleQueue.dequeue(female); cout << "第" << round << "轮配对:男" << male << "和女" << female << "配对成功!" << endl; round++; // 如果男队或女队中还有未配对者,则重新入队 if (!maleQueue.isEmpty() && femaleQueue.isEmpty()) { maleQueue.enqueue(male); } if (maleQueue.isEmpty() && !femaleQueue.isEmpty()) { femaleQueue.enqueue(female); } } // 输出配对结果 if (maleQueue.isEmpty() && femaleQueue.isEmpty()) { cout << "所有人都配对成功!" << endl; } else if (maleQueue.isEmpty()) { cout << "男队中还有未配对者!" << endl; } else { cout << "女队中还有未配对者!" << endl; } return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值