注册 登录
编程论坛 C语言论坛

数组的应用!!

dqwybzb 发布于 2020-11-24 16:13, 1470 次点击
求大于m并且紧跟m的n个素数,并存入数组中,输出。
3 回复
#2
nosnoy2020-11-24 17:04
我个人只想到两种方法,第一是建立素数库,判断m的值在哪,输出后N个数就行
第二是对>m的每个值进行判断其是否为素数。
前者属于一次运行,终身收益,后者随取随用,除却第一次比前者所需时间少,后面每次的运行时间都是要大些的


补充,可以考虑采取第二种方式,每一次运行都进行一次存储(排序),第二次判断m的值是否在存储的数组之间,在的话可以先提取,再判断,久而久之素数库越来越充分,自然所需时间也越来越少

[此贴子已经被作者于2020-11-24 17:08编辑过]

#3
风过无痕19892020-11-25 00:20
回复 楼主 dqwybzb
此题实际上就给定了求素数范围的左边界,而右边界则变相给定,程序如下:
程序代码:

#include<stdio.h>

void main()
{
    int m;                         // 给出素数的左边界
    int n,s = 0;
    int i, j, k = 0;

    scanf("%d%d", &m, &n);
    int p[n];                      // VS2015好像不支持变长数组,为此这里可设为 10000 (根据 n 值来设就行)
    for (i = m;i < 100000000;i++)  // 不可以 m + n 作为右边界,因为其中的数不一定就是素数
    {
        for (j = 2;j < 100000000;j++)
        {
            if (i % j == 0)
                break;
        }
        if (i == j)
        {
            p[s] = i;              // 求得素数,存入数组
            s++;
            k++;
        }
        if (n == k)
            break;
    }
    printf("\n");
    for (i = 0;i < n;i++)         // 此时数组的右边界是确定的
        printf("%d ",p[i]);
    printf("\n");
}
#4
纯蓝之刃2020-11-25 14:52
程序代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

void main()
{
    unsigned int m,n,*p,count=0,j,k;
    scanf("%d %d",&m,&n);
    p=(unsigned int *)malloc(n*sizeof(unsigned int));

    while(count<n)
    {
        ++m;
        k=(int)sqrt(m);
        for(j=2;j<=k;j++)
            if(m%j==0)
                break;
        if(j>k)
        {
            *(p+count)=m;
            ++count;
        }
    }

    for(j=0;j<n;j++)         // 此时数组的右边界是确定的
        printf("%d ",p[j]);
    printf("\n");

    free(p);
}
1