要求:首先输入一个整数,决定了你要找的素数的范围。然后动态分配出一个数组,进行素数筛。最后,根据需要输出数组中的素数(比如要求输出某个范围而不是整个数组的素数都输出)、统计在这个范围内素数的个数。
#include<stdio.h>
#include<stdlib.h>
int is_primer(int b,int arr[]);
int main(){
int number;
int* arr;
int b;
int c;
int count=0;
int n;
printf("range:");
scanf("%d",&number);
arr = (int*)malloc(number*sizeof(int));
for(int i=0;i<number;i++){
arr[i] = i+2; //直接令数组0位为2,1不作讨论
}
printf("searrch range:");
scanf("%d %d",&b,&c);
int b2 = b;
int b3 = b;
for(b;b<=c;b++){
n = arr[b];
for(int d=2;d<n;d++){ //d为除数
if(n%d==0){
count++;
break;
}
}
}
for(b3;b3<c;b3++){
if(is_primer(b3,arr))
printf("%d\n",arr[b3]);
}
count = (c-b2)-count+1;
printf("count:");
printf("%d\n",count);
}
int is_primer(int b,int arr[]){
int n =arr[b];
int ret = 1;
for(int i=2;i<n;i++){
if(n%i==0){
ret = 0;
break;
}
}
return ret;
}
自我感觉:代码过于繁杂,变量命名过多,可读性差,判断素数个数的代码可以用函数表达,感觉可用指针优化但指针不够熟练或者说不会用。虽然写了出来但很烂。
小改进:用sqrt,引入计算素数个数的函数
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int fornum(int b,int i,int c,int arr[]);
int is_primer(int b,int arr[]);
int main(){
int number;
int* arr;
int b;
int c;
int count=0;
int n;
printf("range:");
scanf("%d",&number);
arr = (int*)malloc(number*sizeof(int));
for(int i=0;i<number;i++){
arr[i] = i+2; //直接令数组0位为2,1不作讨论
}
printf("searrch range:");
scanf("%d %d",&b,&c);
int b2 = b;
int b3 = b;
for(b3;b3<c;b3++){
if(is_primer(b3,arr))
printf("%d\n",arr[b3]);
}
//count = (c-b2)-count+1;
printf("count:");
printf("%d\n",fornum(b,b2,c,arr));
free(arr);
}
int is_primer(int b,int arr[]){
int n =arr[b];
int ret = 1;
for(int i=2;i<sqrt(n);i++){
if(n%i==0){
ret = 0;
break;
}
}
return ret;
}
int fornum(int b,int i,int c,int arr[]){
int n;
int count=0;
for(b;b<=c;b++){
n = arr[b];
for(int d=2;d<sqrt(n);d++){ //d为除数
if(n%d==0){
count++;
break;
}
}
}
return (c-i)-count;
}
也可将数组内所有非素数改为0,随后判断输入范围内非0元素的个数并输出。