前言
这一题比前面几道函数题简单一些,不过自己在写程序的时候也犯了错误。把自己的方法和错误记录下来。
正文
代码(正确)
#include <stdio.h>
#include <math.h>
int prime( int p );
void Goldbach( int n );
int main()
{
int m, n, i, cnt;
scanf("%d %d", &m, &n);
if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
if ( m < 6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(", ");
else printf("\n");
}
return 0;
}
int prime( int p ){/*判断是否为素数*/
int i;
if(p==2)
return 1;
else if(p==1)/*分开处理1和2的特殊情况*/
return 0;
for(i=2;i<p;i++){
if((p%i)==0)
return 0;
}
return 1;
}
void Goldbach( int n ){
int i,j;
int count=0;//用于计数
for(i=2;i<n;i++){
for(j=2;j<n;j++){
if(prime(i)==1&&prime(j)==1&&n==i+j){
printf("%d=%d+%d",n,i,j);
count=1;
}
if(count)break; //从最小的循环第一次后就结束
}
}
}
之前判断素数的代码写错了,如下
错误:
没考虑1的情况。
for 循环return 1的位置错了,不能在循环内部,而要在循环体外部。
int prime( int p ){/*判断是否为素数*/
int i;
if(p==2)
return 1;
for(i=2;i<p;i++){
if((p%i)==0)
return 0;
else
return 1;
}
}