哥德巴赫猜想:任何一个大于2的偶数总能表示为两个素数之和。设计一个C语言程序,在int范围内验证此猜想。(要求:不得自定义函数。)
输入格式:
输入一个大于2的偶数N。
输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。
#include<stdio.h>
#include<math.h>
int main(){
int n, i, j, flaga, flagb;
scanf("%d", &n);
for(i=2; i<=n/2; i++){ // 注:i<=n/2
// 思路:从i=2开始,寻找这样的 i : i是素数 并且 n-i 也是素数
// (1) 判断 i 是否是素数
flaga=1;
for (j=2; j<=sqrt(i); j++){
if(i%j==0){
flaga=0;
break;
}
}
// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数
if(flaga==1){
flagb=1;
for (j=2; j<=sqrt(n-i); j++){
if((n-i)%j==0){
flagb=0;
break;
}
}
// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一)
if (flagb==1){
printf("%d = %d + %d\n", n, i, n-i);
}
}
}
return 0;
}
输入:
200
输出:
200 = 3 + 197
200 = 7 + 193
200 = 19 + 181
200 = 37 + 163
200 = 43 + 157
200 = 61 + 139
200 = 73 + 127
200 = 97 + 103
由此得出结论:这样的分解一般不唯一。
【扩展1】因为这样的分解不唯一,若只要求输出所有“N = p + q”分解中p最小的分解,则程序如下(增加了下面程序中的最后一个break):
#include<stdio.h>
#include<math.h>
int main(){
int n, i, j, flaga, flagb;
scanf("%d", &n);
for(i=2; i<=n/2; i++){ // 注:i<=n/2
// 思路:从i=2开始,寻找这样的 i : i是素数 并且 n-i 也是素数
// (1) 判断 i 是否是素数
flaga=1;
for (j=2; j<=sqrt(i); j++){
if(i%j==0){
flaga=0;
break;
}
}
// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数
if(flaga==1){
flagb=1;
for (j=2; j<=sqrt(n-i); j++){
if((n-i)%j==0){
flagb=0;
break;
}
}
// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一)
if (flagb==1){
printf("%d = %d + %d\n", n, i, n-i);
break;
}
}
}
return 0;
}
输入:
100
输出:
100 = 3 + 97
【扩展2】因为这样的分解不唯一,若只要求输出所有“N = p + q”分解中p最大的分解,则程序如下:
#include<stdio.h>
#include<math.h>
int main(){
int n, i, j, flaga, flagb;
scanf("%d", &n);
for(i=n-2; i>=n/2; i--){ // 注:i<=n/2
// 思路:从i=2开始,寻找这样的 i : i是素数 并且 n-i 也是素数
// (1) 判断 i 是否是素数
flaga=1;
for (j=2; j<=sqrt(i); j++){
if(i%j==0){
flaga=0;
break;
}
}
// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数
if(flaga==1){
flagb=1;
for (j=2; j<=sqrt(n-i); j++){
if((n-i)%j==0){
flagb=0;
break;
}
}
// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一)
if (flagb==1){
printf("%d = %d + %d\n", n, i, n-i);
break;
}
}
}
return 0;
}
或者如下:
#include<stdio.h>
#include<math.h>
int main(){
int n, i, j, flaga, flagb;
scanf("%d", &n);
for(i=2; i<=n/2; i++){ // 注:i<=n/2
// 思路:从i=2开始,寻找这样的 i : i是素数 并且 n-i 也是素数
// (1) 判断 i 是否是素数
flaga=1;
for (j=2; j<=sqrt(i); j++){
if(i%j==0){
flaga=0;
break;
}
}
// (2) 若 i 是素数,则进一步,判断 n-i 是否也是素数
if(flaga==1){
flagb=1;
for (j=2; j<=sqrt(n-i); j++){
if((n-i)%j==0){
flagb=0;
break;
}
}
// 若 n-i 也是素数,说明已经找到一组分解,寻找结束(一般分解不唯一)
if (flagb==1){
printf("%d = %d + %d\n", n, n-i, i);
break;
}
}
}
return 0;
}
735

被折叠的 条评论
为什么被折叠?



