专栏名称: 灰灰考研
最全的计算机软工考研专业课信息! 最丰富的共享资料! 最大程度上帮助学渣狗登上研究生大门!
目录
相关文章推荐
51好读  ›  专栏  ›  灰灰考研

每日一道编程题(387):西北大学上机题(五)

灰灰考研  · 公众号  · 考研  · 2019-06-10 00:00

正文

请到「今天看啥」查看全文


西北大学上机题(五)

每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399

是不是超素数?

如果一个数是素数,并且能被分解为C(C>=2)个连续素数的和,则称这个数为“超素数”,请编程判断一个数是否是超素数。

输入格式:

一个正整数N(1

输出格式:

给定的整数N为超素数,请输入yes,否则请输出no

输入样例:

5

输出样例:

yes

解决方法:

(1)算法的基本思想:

1)先找出小于N的所有素数。

2)从这些素数的子序列中寻找和等于N的子序列,通过两个工作指针p,q,一个指向序列的开始,一个指向序列的末尾,开始时p指向第一个素数,q指向小于N的最后一个素数。若子序列的和比N小,则p后移,若和比N大,则q前移,否则,即找到了和等于N的连续素数序列。

(2)代码实现:

#include 
#include 
#define MAX_LENGTH 100000
using namespace std;

bool isPrimeNumber(int num);          //判断是否是素数
bool isSuperPrimeNumber(int num);     //判断是否是超素数
int sumOfArr(int *arr, int m, int n)//求数组arr从m到n的元素之和

int main(void)
{
    int num;
    cout <"请输入数字:"     cin >> num;
    if (isSuperPrimeNumber(num))
    {
        cout <"yes"     }
    else
    {
        cout <"no"     }
    return 0;
}

bool isPrimeNumber(int num)
//判断是否是素数
    if (num <= 1)
        return false;
    int result = true;
    for (int i = 2; i <= sqrt(num); i++)
    {
        if (num % i == 0)
        {
            result = false;
            break;
        }
    }
    return result;
}

bool isSuperPrimeNumber(int num)
{
    //若num不是素数,返回false
    if (!isPrimeNumber(num))
        return false;
    bool result = true;
    int prime_arr[MAX_LENGTH]; //存放素数序列
    int length = 0;
    for (int i = 2; i     { //找出所有小于num的素数,存入prime_arr中
        if (isPrimeNumber(i))
        {
            prime_arr[length] = i;
            length++;
        }
    }
    int p, q; //定义两个工作指针,分别指向子序列的起始
    p = 0;
    q = length - 1;
    while (p     { //尝试找出和为num的子序列
        int sum = sumOfArr(prime_arr, p, q);
        if (sum         { //和小了,p后移
            p++;
        }
        else if (sum > num)
        { //和大了,q前移
            q--;
        }
        else
        { //找到了子序列
            break;
        }
    }
    if (p == q)
    { //检查是否是找到子序列而跳出循环的
        result = false;
    }
    else
    {
        //为了让结果更清楚,当是超素数时,输出具体的组合
        cout <"----- SUM OF -----"         for (int i = p; i <= q; i++)
        {
            cout <" ";
        }
        cout         cout <"------------------"     }
    return result;
}

int sumOfArr(int *arr, int m, int n)
//求数组arr从m到n的元素之和
    int sum = 0;
    for (int i = m; i <= n; i++)
    {
        sum += arr[i];
    }
    return sum;
}

明日预告:西北大学上机题(六)

字符串处理-1-字母a的个数

输入格式:

输入一段不超过80个英文字符的字符串,统计其中有多少个a字母

输出格式:

输出这段英文字符中字母a的个数

输入样例:

fave cad ecd ygaijj

输出样例:

3







请到「今天看啥」查看全文