最近,有人给我私信问我怎么用C语言求素数!!!
于是乎我这个码龄1年的小萌新就来解决他的问题。
素数,也称质数,是指只能被1和自身整除的正整数。在大于1的自然数中,2是最小的素数,其他的素数依次为3、5、7、11、13、17、19、23……。素数的特点是除了1和自身之外没有其他因数。因此,素数无法被其他数整除,也不能被分解为其他的乘积。素数在数论和密码学等领域有重要的应用。
先举个栗子100——200之间的素数。
说到素数大家一定会先这么写:
#define CRT SECURE NO WARNINGS
#include<stdio.h>
int main()
{
?? ?int i = 0;
?? ?int count = 0;
?? ?for(i = 100;i <= 200;i++)
?? ?{
?? ??? ?int flat = 1;
?? ??? ?int j = 0;
?? ??? ?for(j = 2;j < i;j++)
?? ??? ?{
?? ??? ??? ?if(i % j == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?flat = 0;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if(flat == 1)
?? ??? ?{
?? ??? ??? ?count++;
?? ??? ??? ?printf("%d ",i);
?? ??? ??? ?
?? ??? ?}
?? ?}?? ?printf("\ncount=%d\n",count);
?? ?return 0;
}#define CRT SECURE NO WARNINGS #include<stdio.h> int main() { int i = 0; int count = 0; for(i = 100;i <= 200;i++) { int flat = 1; int j = 0; for(j = 2;j < i;j++) { if(i % j == 0) { flat = 0; break; } } if(flat == 1) { count++; printf("%d ",i); } } printf("\ncount=%d\n",count); return 0; }
但这个复杂度有点高!
如果了解素数,就知道不是素数的数一定可以被小于它开方后的整数整除,所以————嘿嘿!
#define CRT SECURE NO WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
?? ?double i = 0;
?? ?int count = 0;
?? ?for(i = 100;i <= 200;i++)
?? ?{
?? ??? ?int flat = 1;
?? ??? ?int j = 0;
?? ??? ?for(j = 2;j <= sqrt(i);j++)
?? ??? ?{
?? ??? ??? ?if(int(i) % j == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?flat = 0;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if(flat == 1)
?? ??? ?{
?? ??? ??? ?count++;
?? ??? ??? ?printf("%d ",int(i));
?? ??? ??? ?
?? ??? ?}
?? ?}?? ?printf("\ncount=%d\n",count);
?? ?return 0;
}#define CRT SECURE NO WARNINGS #include<stdio.h> #include<math.h> int main() { double i = 0; int count = 0; for(i = 100;i <= 200;i++) { int flat = 1; int j = 0; for(j = 2;j <= sqrt(i);j++) { if(int(i) % j == 0) { flat = 0; break; } } if(flat == 1) { count++; printf("%d ",int(i)); } } printf("\ncount=%d\n",count); return 0; }
不,这还是不让计算机偷懒!!!
对了,差点忘了,好像偶数里只有2是素数!!!所以————吼吼!
#define CRT SECURE NO WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
double i = 0;
int count = 0;
for(i = 101;i <= 200;i+=2)
{
?? ?int flat = 1;
?? ?int j = 0;
?? ?for(j = 2;j <= sqrt(i);j++)
?? ?{
?? ??? ?if(int(i) % j == 0)
?? ??? ?{
?? ??? ??? ?flat = 0;
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?if(flat == 1)
?? ?{
?? ??? ?count++;
?? ??? ?printf("%d ",int(i));
?? ??? ??? ?
?? ?}
}printf("\ncount=%d\n",count);
return 0;
}#define CRT SECURE NO WARNINGS #include<stdio.h> #include<math.h> int main() { double i = 0; int count = 0; for(i = 101;i <= 200;i+=2) { int flat = 1; int j = 0; for(j = 2;j <= sqrt(i);j++) { if(int(i) % j == 0) { flat = 0; break; } } if(flat == 1) { count++; printf("%d ",int(i)); } } printf("\ncount=%d\n",count); return 0; }
这样就好了嘛,不不不,我还要把他变成函数。
#define CRT SECURE NO WARNINGS
#include<stdio.h>
#include<math.h>int is_prime(double(n))
{
?? ?int j = 0;
?? ?for(j = 2;j <= sqrt(n);j++)
?? ?{
?? ??? ?if(int(n) % j == 0)
?? ??? ?{
?? ??? ??? ?return 0;
?? ??? ?}
?? ?}
?? ?return 1;
}int main()
{
?? ?double i = 0;
?? ?int count = 0;
?? ?for(i = 101;i <= 200;i+=2)
?? ?{
?? ??? ?if(is_prime(i) == 1)
?? ??? ?{
?? ??? ??? ?count++;
?? ??? ??? ?printf("%d ",int(i));
?? ??? ?}
?? ?}?? ?printf("\ncount=%d\n",count);
?? ?return 0;
}#define CRT SECURE NO WARNINGS #include<stdio.h> #include<math.h> int is_prime(double(n)) { int j = 0; for(j = 2;j <= sqrt(n);j++) { if(int(n) % j == 0) { return 0; } } return 1; } int main() { double i = 0; int count = 0; for(i = 101;i <= 200;i+=2) { if(is_prime(i) == 1) { count++; printf("%d ",int(i)); } } printf("\ncount=%d\n",count); return 0; }
嘿嘿轻松解决!
其实还能再加,但本猿要期末了!!!呜—呜——呜—呜呜呜呜——————