哥德巴赫猜想---导序言

哥德巴赫猜想:任一大于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循环,这是一个小技巧,它的奥妙在于减少了判断的次数,缩小了时间复杂度,在自己编码的时候也可以尝试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值