题目一:求N以内的所有素数
题目描述:
输出N以内的素数。
输入要求:
N
输出要求:
0~N的素数
#include
#include
#include
#include
using namespace std;
int main() {
int n, m, x;
cin >> n;
if (n >= 2)//由于开根号的运算,将2和3两素数单独拿出来
{
cout << "2" << endl;
}
if (n >= 3)
{
cout << "3" << endl;
}
for (int i = 2; i <= n; i++)
{
int i0 = sqrt(i);
for (int j = 2; j <= i0; j++)
{
int m = i % j;
if (m == 0)
{
break;
}
else if (j == i0)
{
cout << i << endl;
}
}
}
return 0;
}
题目二:五位以内的对称素数
题目描述:
判断一个数是否为对称且不大于五位数的素数。
意思是小于100,000的数
输入要求:
第一行:测试数据组数T
接下来包含T行,每行由1个不大于五位数的正整数构成。
输出要求:
对于每个正整数,如果该数是不大于五位数的对称素数,则输出”Yes”,否则输出”No”,每个判断结果单独列一行。
#include
#include
#include
#include
using namespace std;
int main() {
int t, x, n, m, x1;
cin >> t;
while (t--)
{
cin >> x;
x1 = x;
m = 1;
if (x >= 100000 || x <= 10)//判断是否为对称且不大于5位数
{
cout << "No" << endl;
}
else
{
n = 0;
do
{
n = n * 10 + x % 10;//求x的逆序数判断其是否对称
x /= 10;
} while (x > 0);
if (x1 == n)
{
int x0 = sqrt(x1);
for (int i = 1; i <= x0; i++)
{
if (x1 % i != 0)//没有因子则计数器+1
{
m++;
}
}
if (m == x0)//判断是否为素数
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
else//如果不是对称数,则输出No
{
cout << "No" << endl;
}
}
}
return 0;
}
题目三:Lucky Word(含简单的素数运用)
题目描述:
笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小熊就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
输入要求:
第一行数据N
接下来N行每行输入一个字母
输出要求:
每组测试数据输出共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”; 第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0
#include
#include
#include
#include
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
char ch[100];
int arr[26] = { 0 };
cin >> ch;
for (int i = 0; ch[i] != '\0'; i++)//统计字母中每个单词个数
{
for (char j = 'a'; j <= 'z'; j++)
{
if (ch[i] == j)
{
arr[j - 'a']++;
}
}
}
int maxn, minn, sub;
maxn = 0;
minn = 0x3f3f3f;
for (int k = 0; k < 26; k++)//找出出现最多和最少的字母
{
maxn = max(maxn, arr[k]);
if (arr[k] > 0)//最少为1
{
minn = min(minn, arr[k]);
}
}
sub = maxn - minn;
if (sub == 0 || sub == 1)//0和1不是素数,拿出来判断
{
cout << "No Answer" << endl;
cout << "0" << endl;
}
else//运用素数判断
{
int sub0 = sqrt(sub);
int x;
for (x = 2; x < sub0; x++)
{
if (sub % x == 0)
{
cout << "No Answer" << endl;
cout << "0" << endl;
break;
}
}
if (x >= sub0)
{
cout << "Lucky Word" << endl;
cout << sub << endl;
}
}
}
return 0;
}
问题四:哥德巴赫猜想
题目描述:
将偶数x分解为两个素数的和,输出这种分解有多少种可能的方案数,其中需要判断一个数是否为素数,判断素数的功能要求自己写函数实现(否则不给分)
输入要求:
输入一个整数x,x>2
输出要求:
输出方案数
#include
#include
#include
#include
using namespace std;
int prime(int x)//判断是否为素数的函数
{
if (x == 2 || x == 3)
{
return 1;
}
else
{
int x0 = sqrt(x);
for (int i = 2; i <= x0; i++)
{
if (x % i == 0)
{
return 0;
}
}
return 1;
}
}
int main() {
int a, count;
count = 0;
cin >> a;
for (int i = 2; i <= a / 2; i++)//由于1不是素数,直接从2开始遍历,到a/2
{
if (prime(i) && prime(a - i))
{
count++;
}
}
cout << count;
return 0;
}
问题五:素数三元组
题目描述:
相邻三个奇数都是素数是一种非常少见的情形,也就是三个奇数p-2, p, p+2都是素数,这样就形成了一个素数三元组。输入数字n,在1~n的所有素数三元组。
要求定义素数判断函数。
输入要求:
输入多组数据,每组测试数据为一个正整数n,n <= 5000000。
输出要求:
输出大小不超过n的所有的素数三元组,每行按照从小到大的顺序输出一个三元组中的三个数,两个数之间用空格间隔(最后一个数字没空格)。如果不存在这样的素数三元组,请输出“No triple”。
#include
#include
#include
#include
#include
using namespace std;
int prime(int a, int b, int c)
{
int a0 = sqrt(a), b0 = sqrt(b), c0 = sqrt(c), max0;
max0 = max(a0, max(b0, c0));
for (int i = 2; i <= max0; i++)
{
if (a % i == 0 || b % i == 0 || c % i == 0)
{
return 0;
}
}
return 1;
}
int main() {
int n, cnt;
while (scanf("%d", &n) != EOF)//Ctrl+Z结束运行
{
cnt = 0;
if (n < 7)
{
cout << "No triple" << endl;
}
else
{
int triple;
for (int i = 5; i <= n; i++)//最小的素数三元组3、5、7
{
if (i % 2 == 1)
{
triple = prime(i - 2, i, i + 2);
if (triple)
{
cout << i - 2 << " " << i << " " << i + 2 << endl;
cnt++;
}
}
}
if (cnt == 0)
{
cout << "No triple" << endl;
}
}
}
return 0;
}
问题六:素数环
问题描述:
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
输入要求:
有多组测试数据,每组输入一个n(0 输出要求: 每组第一行输出对应的Case序号,从1开始。 如果存在满足题意叙述的素数环,从小到大输出。 否则输出No Answer。#include