哥德巴赫猜想,不是想证明这个结论,而是对于任给的一个不小于6的偶数,来寻找和等于该偶数的所有素数对。做好了这件实事,就能说明这个猜想是成立的。
要求程序定义一个prime()函数和一个main()函数,prime()函数判断一个整数n是否是素数,其余功能在main()函数中实现。
int prime(int n)
{
//判断n是否为素数, 若n为素数,本函数返回1,否则返回0
}
提交网站时,时间超限
#include <stdio.h>
#include <math.h>
int prime(int n);
int main(int argc, char const *argv[]){
int m,i,j;
scanf("%d", &m);
for( i=2; i<m; i++ ){
for( j=2; j<m; j++ ){
if( prime(i)&&prime(j)){//若i和j都是素数
if( i+j==m&&i<=j )//判断去重
printf("%d %d\n", i,j);
}
}
}
return 0;
}
int prime(int n){//判断是否是素数
int flag=1;
for( int i=2; i<=sqrt(n); i++ ){
if( n%i==0||n==1 )
flag=0;
}
return flag;
}
结果正确
解决时间超限
解决方案
改用单层循环i,利用循环得出另一位j
代码如下
#include <stdio.h>
#include <math.h>
int prime(int n);
int main(int argc, char const *argv[]){
int m,i,j;
scanf("%d", &m);
for( i=2; i<m; i++ ){
j=m-i;
if( prime(i)&&prime(j)){//若i和j都是素数
if( i<=j )//判断去重
printf("%d %d\n", i,j);
}
}
return 0;
}
int prime(int n){//判断是否是素数
int flag=1;
for( int i=2; i<=sqrt(n); i++ ){
if( n%i==0||n==1 )
flag=0;
}
return flag;
}
修改如下,供参考:
#include <stdio.h>
#include <math.h>
int prime(int n);
int main(int argc, char const* argv[]) {
int m, i, j, t;
scanf("%d", &m);
for (i = 2, t = m / 2; i <= t; i++) { //for (i = 2; i < m; i++) 修改
j = m - i;
if (prime(i) && prime(j)) {//若i和j都是素数
if (i <= j)//判断去重
printf("%d %d\n", i, j);
}
}
return 0;
}
int prime(int n) {//判断是否是素数 修改
if (n <= 3) return n > 1;
int flag = (int)sqrt(n);
for (int i = 2; i <= flag; i++)
if (n % i == 0) return 0;
return 1;
}
你是想问什么?发文请点右上角创作