C语言程序设计(第三版)何钦铭著 习题6-5
题目
使用函数验证哥德巴赫猜想;
任何一个不小于 6 的偶数均可表示为两个奇素数之和。
例如 6=3+3,8=3+5,…,18=5+13。
将6~100 之间的偶数都表示成两个素数之和,打印时一行打印 5组。试编写相应程序。
分析过程
输入
条件:无
输出
条件:将6~100 之间的偶数都表示成两个素数之和。
要求,打印时一行打印 5组。
代码
#include <stdio.h>
#include <math.h>
int prime(int n);
int Goldbach(int n);
int main(void) {
int count=0;/*可实现哥德巴赫猜想的数量*/
for(int i=6; i<= 100; i++){/*i选择小于21,是因为Fibonacci 数的第21项为10946(已经大于10000),所以循环至第21项已经足够了*/
if(Goldbach(i)==1) {
count++;
if ( count%5 ) printf(", ");/*一行不足五个,用‘,’隔开*/
else printf("\n");/*一行满五个进行换行*/
}
}
return 0;
}
int prime(int n){/*判断n是否为素数*/
if(n<=1) return 0;/*小于1不是素数*/
if(n==2||n==3) return 1;/*2和3为素数*/
for(int i=2; i<=n/2;i++){/*判断大于三的数是否为素数*/
if(n%i==0) return 0;/*判断i是否能将n整除,若能整除,则说明n不是素数,返回0(代表n不是素数)*/
}
return 1;/*若此时函数还未终止,说明未找到能将n整除的数,即n为素数*/
}
int Goldbach(int n){/*存储整数n的哥德巴赫猜想*/
for(int i=2; i<=n/2; i++){
if(prime(i)==1&&prime(n-i)==1){/*将整数n拆分成i和n-i两个素数的和,成立,则输出,并返回该数可以实现哥德巴赫猜想*/
printf("%d=%d+%d", n, i, n-i);
return 1;/*可实现哥德巴赫猜想*/
}
}
return 0;/*不可实现哥德巴赫猜想*/
}