哥德巴赫猜想:任一大于2的偶数,都可以表示成两个素数之和。
验证:2000以内大于2的偶数都能够分解为两个素数之和。
#include <iostream>
#include<cmath>
using namespace std;
int prime(int n);//判断是否为素数
int main()
{
int i,n;
for(i=4;i<=2000;i+=2)
{
for(n=2;n<i;n++)
if(prime(n))
if(prime(i-n))
{
cout<<i<<"="<<n<<"+"<<i-n<<endl;
break;
}
if(n==i)
cout<<"error "<<endl;
}
return 0;
}
int prime(int i)
{
int j;
if(i<=1)return 0;
if(i==2)return 1;
for(j=2;j<=(int)(sqrt((double)i));j++)
if(i%j==0)
return 0;
return 1;
}
在二级C语言的练习中我们还接触到一款类似的题型—分解数为两个素数的乘积。
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
int fun(int n,int *x,int *y)
{
int k,flag=0;
for (k = 2; k <= sqrt(n); k++)
{
if (n % k != 0)
{
continue;
}
if (prime(k) == 0 || prime(n/k) == 0)
{
continue;
}
flag = 1;
*x = k;
*y = n/k;
break;
}
return flag;
}
int main()
{
int a,b;FILE *out ;
out = fopen("out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
if(fun(11111,&a,&b)) {
printf("11111=%d*%d\n",a,b);
fprintf(out, "11111=%d*%d\n",a,b);
}
if(fun(1111111,&a,&b)) {
printf("1111111=%d*%d\n",a,b);
fprintf(out,"1111111=%d*%d\n",a,b);
}
fclose(out);
getchar();
return 0;
}
总结:
素数问题我们接触到很多,像把一个素数拆解成两个素数之和或把一个数拆解成两个素数之积,都是对于素数问题更好的引申。在编码过程中,我们接触到这样一个表达—(int)(sqrt((double)i))
多应用于for循环,这是一个小技巧,它的奥妙在于减少了判断的次数,缩小了时间复杂度,在自己编码的时候也可以尝试。