验证“哥德巴赫猜想在1000内成立 分析(简单算法): 主函数的算法:对4到1000之间的偶数进行穷举,验证每一个偶数都可以分解成两个 素数的和。(将分解过程单独写成一个函数 goldbach) ·函数 goldbahe的算法:对于一个偶数even,要想分解成m+n,首先要对m从2至m2 进行穷举,得到其中的一个数m,自然,另外一个数就是n=even-m,然后验证这一对 数是否是素数,是的话,得到的m和n就是一组分解,不是继续判断下一组m和n(这 里判断素数可以另写成一个函数 prime) ·函数 prime的算法:对于一个数n要判断它是否是素数,要从2至 sqrt(n)进行穷举,验 证每一个数是否能整除n,如果发现能整除的数,说明n不是素数,返回0,否则,继 续验证下一个数。直至循环结束返回1 (解法一:不用指针) # include int prime(intn);/*函数声明*/ void goldbach( int even);/*函数声明*/ void main for(i=4i<=1000i+=2)/*循环验证4-1000之间的每一个正偶数*/ Goldbach()/*函数调用* if(i%50==0) i puts("press \enter\ to continue"); getchar: /*因为结果较多,中间停顿一次,目的是将结果分两次输出,用户按回车键后继续后半部 分结果的输出*/ } int prime(intn)/*函数功能:判断n是否为素数,是返回1,不是返回0*/ int i;
验证“哥德巴赫猜想在 1000 内成立 分析(简单算法): ⚫ 主函数的算法:对 4 到 1000 之间的偶数进行穷举,验证每一个偶数都可以分解成两个 素数的和。(将分解过程单独写成一个函数 goldbahe) ⚫ 函数 goldbahe 的算法:对于一个偶数 even,要想分解成 m+n,首先要对 m 从 2 至 m/2 进行穷举,得到其中的一个数 m,自然,另外一个数就是 n=even-m,然后验证这一对 数是否是素数,是的话,得到的 m 和 n 就是一组分解,不是继续判断下一组 m 和 n.(这 里判断素数可以另写成一个函数 prime) ⚫ 函数 prime 的算法:对于一个数 n,要判断它是否是素数,要从 2 至 sqrt(n)进行穷举,验 证每一个数是否能整除 n,如果发现能整除的数,说明 n 不是素数,返回 0,否则,继 续验证下一个数。直至循环结束返回 1. (解法一:不用指针)#include #include int prime(int n); /*函数声明*/ void Goldbach(int even);/*函数声明*/ void main() { int i; for(i=4;i<=1000;i+=2) /*循环验证 4-1000 之间的每一个正偶数*/ { Goldbach(i); /*函数调用*/ if(i%50==0) { puts("press \'enter\' to continue"); getchar(); } /*因为结果较多,中间停顿一次,目的是将结果分两次输出,用户按回车键后继续后半部 分结果的输出*/ } } int prime(int n) /*函数功能:判断 n 是否为素数,是返回 1,不是返回 0*/ { int i;
for(i=2;i int prime(intn);/*函数声明*/ void Goldbach( int even int*aint*b)/*函数声明*/ void maino i int i; for(i=4;i<=10000;i+=2)/*循环验证4-1000之间的每一个正偶数*/ Goldbach(i&m,&n)/*函数调用:对i进行分解,并将mn的地址传递给 形参,则函数中可以通过形参对mn进行间接引用,分解结果直接写入mn* printf("%/od=%od+/od\n"i, m, n); if(i9%050==0) /*因为结果较多,中间停顿一次,目的是将结果分两次输出, 用户按回车键后继续后半部分结果的输出*/ i puts("press l'enteri to continue"); getchar
for(i=2;i #include int prime(int n); /*函数声明*/ void Goldbach(int even,int *a,int *b); /*函数声明*/ void main() { int i; int m,n; for(i=4;i<=10000;i+=2) /*循环验证 4-1000 之间的每一个正偶数*/ { Goldbach(i,&m,&n); /*函数调用:对 i 进行分解,并将 m,n 的地址传递给 形参,则函数中可以通过形参对 m,n 进行间接引用,分解结果直接写入 m,n*/ printf("%d=%d+%d\n",i,m,n); if(i%50==0) /*因为结果较多,中间停顿一次,目的是将结果分两次输出, 用户按回车键后继续后半部分结果的输出*/ { puts("press \'enter\' to continue"); getchar();
} int prime(intn)/*函数功能:判断n是否为素数,是返回1,不是返回0*/ i int i; for(i=2;i<=sqrt(n)i++)/*在循环中发现有因子,表明不是素数,返回0*/ tf(n%i==0) return OF return1;/*若循环结束仍未执行到 return,则顺序执行此句,返回1,表明没找到因 子,n是素数*/ /*验证even满足哥德巴赫猜想,并将分解的两个素数写到a,b指向的主调函数的变量中 void Goldbach (int even int *a, int *b) int mn;/*两变量分别用于存储分解的两数*/ for(m=2;m<=even/2;m++)/*对第一个数的可能性进行穷举*/ in=even- m /*根据第一个数得到第二个数* if(prime(m)&&prime(n)) /*在此函数中嵌套调用 primed若两数均为素数,表示找到一组分解* *a=m/*将结果写入主函数a,b指向的主调函数的变量中* return;/*返回,因为结果已经通过上步写回去,因此只是返回到主调函数,不带回 有用的数值*/ /*该函数也可写成如下形式:与上边的区别即直接用*a*b,未用mn变量进行过渡 void bahe (int even, int *a int *b) for(*a=2;*a<=even/2;*a++) i*b=even-*aj if( phme(*a)&& prime(*b))/*在此函数中嵌套调用 primeo*/ return;y
} } } int prime(int n) /*函数功能:判断 n 是否为素数,是返回 1,不是返回 0*/ { int i; for(i=2;i<=sqrt(n);i++)/*在循环中发现有因子,表明不是素数,返回 0*/ { if(n%i==0) return 0; } return 1;/*若循环结束仍未执行到 return0,则顺序执行此句,返回 1,表明没找到因 子,n 是素数*/ } /*验证 even 满足哥德巴赫猜想,并将分解的两个素数写到 a,b 指向的主调函数的变量中。 */ void Goldbach(int even,int *a,int *b) { int m,n;/*两变量分别用于存储分解的两数*/ for(m=2; m<=even/2; m++) /*对第一个数的可能性进行穷举*/ { n=even-m; /*根据第一个数得到第二个数*/ if(prime(m)&&prime(n)) /*在此函数中嵌套调用 prime()若两数均为素数,表示找到一组分解*/ { *a=m; /*将结果写入主函数 a,b 指向的主调函数的变量中*/ *b=n; return;/*返回,因为结果已经通过上步写回去,因此只是返回到主调函数,不带回 有用的数值*/ } } } /*该函数也可写成如下形式:与上边的区别即直接用*a,*b,未用 m,n 变量进行过渡 void bahe(int even,int *a,int *b) {for(*a=2;*a<= even/2;*a++) { *b=even-*a; if(prime(*a)&&prime(*b))/*在此函数中嵌套调用 prime()*/ { return; } } } */