【题目描述】
哥德巴赫猜想的命题之一是:大于6 的偶数等于两个素数之和。编程将6~100所有偶数表示成两个素数之和。
【输入】
(无)
【输出】
分行输出:
例如:
6=3+3
8=3+5
…
(每个数只拆开一次,请保证第一个加数最小)
【输入样例】
(无)
【输出样例】
(无)
#include<iostream>
using namespace std;
bool isPrime(int x)
{
//3.判断x是否是素数
if(x<2) return false; //2之前的不是素数
for(int i=2;i<x;i++) //最小的素数是2
{
if(x%i==0) return false; //只要出现余数为0的情况,就不会是素数
}
return true; //剩下的数都是素数
}
int split(int x)
{
//2.拆分数字x
cout<<x<<"=";
for(int i=2;i<x;i++) //先遍历第一个数
{
int i2=x-i; //得到第二个数
if(isPrime(i)&&isPrime(i2)) //两个数分别进行素数的判断
{
cout<<i<<"+"<<i2<<endl; //两个数都是素数的情况下才能输出
break; //跳出循环,保证最小的素数在前面
}
}
}
int main()
{
for(int i=6;i<=100;i+=2) //1.将偶数遍历出来
{
split(i); //调用拆分函数
}
return 0;
}
总结
题目划分了三个步骤:
①遍历偶数,并且调用拆分函数。
这个步骤是在主函数main里写的,这个函数只要做遍历偶数和调用函数两件事情就可以了。巧妙地利用了赋值运算符+=与for循环的结合,将6-100之间的偶数都以参数的方式传进去即可。
②在拆分函数中,将传入的偶数拆成两个数,拆开的数进行素数的判断。
根据题目的要求,先把偶数打印出来,得到左边的 “6=”,再用循环遍历的方法确定第一个数的范围。有了第一个数范围之后,就可以确定第二数的范围。因为我们通过观察得出规律:第二个数 = 偶数 - 第一个数 。接着,我们假设素数函数存在,将两个数分别传入,如果都是素数才可以进行表达式的输出,为了确保最小的素数在前面,我们要用break进行跳出循环的操作。
③写一个判断素数的函数。
做三件事情:第一,判断x小于2的数是不是素数。第二,判断从2到x-1的数是不是素数。第三,剩下的都返回true即可,也就是剩下的数都是素数。
例子:7是不是素数。
从2开始遍历,也就是2、3、4、5、6
7除以2或3或4或5或6,余数都不是0,所以就返回true,也就是7是素数。
例子:6是不是素数。
从2开始遍历,也就是2、3、4、5
6除以2或3或4或5,只要有余数是0的情况,就会返回false,也就是6不是素数。
所以,当循环遍历的时候,不可以遍历自己。
素数:它的因数只有1和本身。素数也可以叫做质数。从字面意思上去看,素数的性格是朴素的,质数的性格是追求质量,它们的共同点就是以少为主,因此共同点可以与素数的概念联系在一起。