C语言程序设计基础|素数

题目一:求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
#include
#include
#include
#include
using namespace std;

int prime[12] = { 2,3,5,7,11,13,17,19,23,29,31,37 };//40以内的全部素数
int mark[20], a[20];
int t, number = 0;

int isprime(int add)//判断是否为素数
{
    for (int i = 0; i < 12; i++)
    {
        if (add == prime[i])
        {
            return 1;
        }
    }
    return 0;
}
void DFS(int level)//深度优先搜索
{
    if (level > t)
    {
        int add0;
        add0 = a[1] + a[t];
        if (isprime(add0) && a[1] == 1)//两数相邻之和为素数且第一个数是1
        {
            for (int i = 1; i <= t; i++)
            {
                cout << a[i];
                if (i != t)
                {
                    cout << " ";
                }
                else
                {
                    cout << endl;
                }
            }
        }
    }
    else
    {
        for (int i = 2; i <= t; i++)//数组a[1]为1固定
        {
            if (mark[i] == 0)//0代表这个位置没有数,填上数记作1
            {
                mark[i] = 1;
                a[level] = i;
                int addl = a[level] + a[level - 1];
                if (isprime(addl))
                {
                    DFS(level + 1);
                }
                mark[i] = 0;
            }
        }
    }
}

int main() {
    while (1)
    {
        cin >> t;
        if (t == 0)
        {
            break;
        }
        else
        {
            number++;
            if (t == 1)//1可以独自成环
            {
                cout << "Case " << number << ":" << endl;
                cout << t << endl;
            }
            else if (t % 2 == 1)//奇数不存在素数环
            {
                cout << "Case " << number << ":" << endl;
                cout << "No Answer" << endl;
            }
            else
            {
                cout << "Case " << number << ":" << endl;
                a[1] = 1;
                DFS(2);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(Simple,C,c语言,c++,算法)