动态数组初学

要求:首先输入一个整数,决定了你要找的素数的范围。然后动态分配出一个数组,进行素数筛。最后,根据需要输出数组中的素数(比如要求输出某个范围而不是整个数组的素数都输出)、统计在这个范围内素数的个数。

#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元素的个数并输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值