范围内寻找素数组合、它们的和也为素数

来源:互联网 发布:c语言中的ifdef ifndef 编辑:程序博客网 时间:2024/05/16 10:53

这一题难度对于我来说非同小可,从十几天前就一直卡住我的思路;今天我做出来的这一种方法在一开始我也想过,只不过快速的排除了,直到没有办法才又想了一下觉得可行。
这一题估计也是我在暑假里写的最长的程序,对于循环的应用要求极高!

/*试定义一个类 Number,求出所有符合下列条件的三元组(a,b,c):a、b、c 均为 30 以内的素数,且它们的和也是一个素数。例如,3,5 和 11 均是素数,且它们的和 3+5+11=19 也是素数,(3,5,11)是一个满足要求的三元组。要求如下:(1)私有数据成员    int datd[50][4]:每一行的后三个元素存储满足条件的一个三元组,第 0 个元素存储后三个元素的和。    int count_data:记录找到的符合题目要求的三元组的个数。(2)公有成员函数    Number():构造函数,初始化数据成员 count_data。    int isprime(int x):判断参数 x 是否为素数,如果是返回 1,否则返回 0。    void fund():找出 30 以内所有符合条件的三元组。    void print():按输出示例格式输出结果。(3) 主函数中对该类进行测试。输出示例(部分)共有 42 个三元组满足条件:(3,5,11):19(3,5,23):31(19,23,29):71*/#include<iostream>using namespace std;class Number{private:    int datd[100][4]; //不能太小,防止调试时产生越界    int count_data;public:    Number();    int isprime(int x);    void fund();    void print();};Number::Number(){    count_data = 0;}int Number::isprime(int x){    if (x == 1)        return 0;    for (int i = 2; i < x; i++)    {        if (x%i == 0)            return 0;    }    return 1;}void Number::fund(){    //把30以内的素数全部列出    int temp[15], count = 0;    for (int i = 3; i < 30; i++)    {        if (isprime(i))        {            temp[count] = i;            count++;        }    }    int temp_before[729][4];    int count_move = 0;    //进行无差别赋值    for (int i = 0; i < count; i++)    {        for (int j = 0; j < count; j++)        {            for (int k = 0; k < count; k++)            {                temp_before[count_move][0] = temp[i];                temp_before[count_move][1] = temp[j];                temp_before[count_move][2] = temp[k];                temp_before[count_move][3] = temp[i] + temp[j] + temp[k];                count_move++;            }        }    }    //进行去重    for (int i = 0; i < count_move; i++)    {        if (temp_before[i][0] == temp_before[i][1] || temp_before[i][0] == temp_before[i][2] || temp_before[i][1] == temp_before[i][2])        {            temp_before[i][3] = -1;            continue;        }        if (temp_before[i][3] == -1)            continue;        for (int j = i + 1; j < count_move; j++)        {            int flag = 0;            for (int k = 0; k < 3; k++)            {                if (temp_before[i][k] == temp_before[j][0])                    flag++;                if (temp_before[i][k] == temp_before[j][1])                    flag++;                if (temp_before[i][k] == temp_before[j][2])                    flag++;            }            if (flag >= 3)            {                temp_before[j][3] = -1;            }        }    }    //把temp_before[][3]不为-1的进行赋值给datd    count_data = 0;    for (int i = 0; i < 729; i++)    {        if (temp_before[i][3] != -1 && isprime(temp_before[i][3]))        {            datd[count_data][0] = temp_before[i][0];            datd[count_data][1] = temp_before[i][1];            datd[count_data][2] = temp_before[i][2];            datd[count_data][3] = temp_before[i][3];            count_data++;        }    }}void Number::print(){    //输出语句    for (int i = 0; i < count_data; i++)    {        cout << "(" << ' ';        for (int j = 0; j < 4; j++)        {            cout << datd[i][j] << ' ';            if (j == 1 || j == 2 || j == 0)                cout << ',' << ' ';        }        cout << ")" << endl;    }    cout << count_data << endl;}int main(){    Number num;    num.fund();    num.print();    system("pause");    return 0;}