啊哈c语言——逻辑挑战8:验证哥德巴赫猜想

啊哈c语言——逻辑挑战8:验证哥德巴赫猜想_第1张图片

         上面这封书信是普鲁士数学家哥德巴赫在1742年6月7日写给瑞士数学家欧拉的,哥德巴赫在书信中提出了“任一大于2的整数都可以写成3个质数之和”的猜想。当时,哥德巴赫遵照的是“1也是素数”的约定。现今,数学界已经不使用这个约定了。哥德巴赫原猜想在现代被陈述为: 任一大于5的整数都可写成3个质数之和。1742年6月30日欧拉在回信中注明,此猜想可以有另一个等价的版本,即“任一大于2的偶数都可写成 两个质数之和”。

        我们现在所说的哥德巴赫猜想通常是指这个版本。两个多世纪过去 了,这一猜想既无法证明,也没有被推翻。我们现在将通过程序在4~ 100内验证这个猜想。

        让我们来验证4~100内所有偶数都可写成两个质数之和。首先4~ 100的偶数循环可以这样写:

啊哈c语言——逻辑挑战8:验证哥德巴赫猜想_第2张图片

         然后我们需要将每一个数k 拆分为a +b 的形式,a 的范围是2~k /2(自己想一想为什么到k /2就可以了)。如果a 和b都是质数的话我们就将其打印出来,说明对于数k我们验证成功了,然后继续验证下一个数。打印的效果如下:

啊哈c语言——逻辑挑战8:验证哥德巴赫猜想_第3张图片

         补充一点:上面的10还可以拆分为5+5,14还可以拆分为7+7。代码框架如下:

啊哈c语言——逻辑挑战8:验证哥德巴赫猜想_第4张图片

         通过之前的学习,我们已经掌握了如何判断一个数是否为质数。我们将判断质数的代码融合到上面的代码中,完整的代码如下:

#include 
#include 
int main()
{
	int k, a, b, i, count1, count2;
	for(k=4; k<=100; k=k+2)
	{
		for(a=2; a<=k/2; a++)
		{
			//判断a是否为质数
			count1=0;
			for(i=2; i<=a-1; i++)
			{
				if(a%i==0)
				{
					count1++;
					break;
				}
			}
			if(count1==0) //如果a为质数
			{
				b=k-a;
				//判断b是否为质数
				count2=0;
				for(i=2; i<=b-1; i++)
				{
					if(b%i==0)
					{
						count2++;
						break;
					}
				}
				if(count2==0) //如果b也是质数
				{
					printf("%d=%d+%d\n", k, a, b);
					break; //打印这个解并跳出循环
				}
			}
		}
	}
	system("pause");
	return 0;
}

这里只验证了从4到100的数,你也可以验证更大的范围。当然,去验证哥德巴赫猜想有很多种方法,显然这种方法是不够好的,判断质数的部分也不够快,这里只是提供一种思路,我想你一定可以找到更高效的方法。

你可能感兴趣的:(啊哈c语言,数据结构)