Vjudge 区间内的真素数

题目:

蒜头君请你帮忙找出正整数 M 和 N 之间(N 不小于 M)的所有真素数。

真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为真素数。

例如,11,13 均为真素数,因为 11 的反序还是为 11,13 的反序为 31 也为素数。

输入格式:

输入两个数 M 和 N,空格间隔,1≤M≤N≤100000。

输出格式:

按从小到大输出 M 和 N 之间(包括M 和 N )的真素数,逗号间隔。如果之间没有真素数,则输出No。

Input:

10 35

Output:

11,13,17,31

实现代码及思想:

素数是除了1和它本身外,不能被其他数整除的数,判断一个数是不是素数是非常简单的。本题的难点主要就是正整数P的反序怎么得到,就是不断的对P进行除运算,取余数乘10,直到P等于0,即可得到反序,不清楚的可以在本子上演示一下就明白了。

#include <iostream>

using namespace std;
int isZhenSuShu(int p);
int isZhenSuShu2(int p);

int main() 
{
	int m,n,i;
	cin>>m>>n;
	int falg=0;
	for(i=m;i<=n;i++)
	{
		if(isZhenSuShu(i)&&isZhenSuShu2(i))
		{
			if(falg==0)
			{
				falg=1;//代表有真素数
				cout << i;
			}
			else
				cout << "," << i;
		}
		
	}
	if(falg==0)
		cout << "No";
	return 0;
}
int isZhenSuShu(int p)
{
	if(p==1||p==2)
		return 1;
	int j;
	for(j=2;j<=p/2;j++)//大于p/2的数,肯定不能整除p
	{
		if(p%j==0)
			return 0;
	}
	if(j>=p)
		return 1;
	return 1;
}
int isZhenSuShu2(int p)
{
	int s=0,k;
	while(p!=0)
	{
		k=p%10;
		s=s*10+k;
		p=p/10;
	}
	return isZhenSuShu(s);
}
在C语言中,区间内的素数是指在给定范围内的质数。要找出这个范围内的素数,可以使用经典的算法,如埃拉托斯特尼筛法(Sieve of Eratosthenes)。以下是简单的步骤: 1. 定义一个函数,接收两个整数作为输入,表示需要检查的范围的起点和终点。 2. 创建一个足够大的布尔数组,用于记录每个数字是否为质数,初始值设为`true`,因为所有大于1的数都可能是质数。 3. 从2开始,将数组中所有的2的倍数标记为非质数(除了2本身)。 4. 遍历数组,对于每一个找到的质数(当前未被标记的数),将它的平方作为起点,跳过它自身,然后将这个平方的所有倍数标记为非质数。 5. 检查数组中的数,如果它们仍然标记为`true`,则它们就是该范围内的素数。 下面是一个简化的示例代码片段: ```c #include <stdio.h> #include <stdbool.h> #define MAX_RANGE 10000 bool is_prime(int num) { if (num <= 1) return false; for (int i = 2; i * i <= num; i++) { if (num % i == 0) return false; } return true; } void find_primes_in_range(int start, int end) { bool prime[MAX_RANGE + 1]; for (int i = 0; i <= MAX_RANGE; i++) prime[i] = true; for (int p = 2; p * p <= end; p++) { if (prime[p]) { for (int i = p * p; i <= end; i += p) prime[i] = false; } } printf("Prime numbers between %d and %d are:\n", start, end); for (int i = start; i <= end; i++) { if (prime[i]) printf("%d ", i); } } int main() { int range_start, range_end; printf("Enter the range (start-end): "); scanf("%d%d", &range_start, &range_end); if (range_start > range_end) { printf("Invalid range. Start must be less than or equal to End.\n"); return 1; } find_primes_in_range(range_start, range_end); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值