解题思路:
1.输入一个数num;
2.让num减去从2到num/2的每一个素数;(1不是素数)
3.判断每一个减得的差,差是素数则成立,coun_t++;
判断素数实现(1)
int judge_sushu( int n ) { int i; for ( i = 2; i < n; i++ ) if ( n % i == 0 ) break; if ( i == n ) return(1); else return(0); }
改进实现(2)
int judge_sushu( int n ) //只判断2到根号n中,是否有元素是n的因子 { int i; float s = sqrt( n ); for ( i = 2; i <= s; i++ ) if ( n % i == 0 ) return(0); return(1); }
参考代码:
#include <stdio.h> #include <math.h> int judge_sushu( int n ); int main() { int num, coun_t; while ( scanf( "%d", &num ) != EOF ) { coun_t = 0; for ( int i = 2; i <= num / 2; i++ ) if ( judge_sushu( i ) ) { if ( judge_sushu( num - i ) ) coun_t++; } printf( "%d\n", coun_t ); } } /*--------------------------------------------------*/ int judge_sushu( int n ) { int i; float s = sqrt( n ); for ( i = 2; i <= s; i++ ) if ( n % i == 0 ) return(0); return(1); }
别忘点赞哦-.-
0.0分
31 人评分
其实可以改成for(int i=3;i<=n/2;i+=2),直接从3开始遍历,然后i+=2,这样占用内存更小,为什么可以这样改呢? 因为i绝不可能等于2,题目要求我们输入一个偶数,偶数要么等于奇数+奇数,要么等于偶数+偶数,然而素数里只有2为偶数,如果i等于2的话,那么另一个数也要是偶数才行,但是这根本做不到,所以改成for(int i=3;i<=n/2;i+=2)工作量更小。 (不是杠精,只是提点建议)
#include<stdio.h> int main(){ int prime[33000]; int Isprime[33000]; int n,k=0,t=0; scanf("%d",&n); prime[0]=prime[1]=1; for(int i=2;i<n;i++) if(prime[i]==0){ for(int j=2;j*i<n;j++){ prime[i*j]=1; } } for(int i=0;i<n;i++){ if(prime[i]==0){ Isprime[t]=i; t++; } } for(int i=0;i<=t;i++) for(int j=0;j<=t;j++){ if(Isprime[i]+Isprime[j]==n)k++; } if(prime[n/2]==0)printf("%d",k/2+1); else printf("%d",k/2); }
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:564 |
人见人爱A+B (C语言代码)浏览:664 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:783 |
淘淘的名单 (C语言代码)答案错误???浏览:624 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:1292 |
WU-输出正反三角形 (C++代码)浏览:1099 |
DNA (C语言描述,蓝桥杯)浏览:1653 |
循环入门练习6 (C语言代码)浏览:1058 |
矩阵转置 (C语言代码)浏览:855 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:827 |