C语言求质数

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MEM_PRIMES 100

int test_prime(unsigned long long N);
int check(unsigned long long buffer[],size_t count,unsigned long long N);
void put_primes(void);

struct 
{
    char *path;
    FILE *pfile;
    int nrec;
    unsigned long long primes[MEM_PRIMES];
    size_t index;    
} global ={
        "d:\\data.bin",
        NULL,
        0,
        {2ULL,3ULL,5ULL},
        3
    };

int main()
{
    unsigned long long trial = 5ULL;
    unsigned long num_primes = 3ULL;
    unsigned long total = 0UL;
    
    printf("输入需要的质数个数:");
    scanf("%lu",&total);
    total = total<4UL ? 4UL:total;
    
    while(num_primes < total)
    {
        trial += 2ULL;
        if(test_prime(trial))
        {
            global.primes[global.index++] = trial;
            num_primes++;
            if(global.index == MEM_PRIMES)
            {
                if(!(global.pfile=fopen(global.path,"ab")))
                {
                    printf("\n%s文件打开错误\n",global.path);
                    system("pause");
                    exit(1);    
                }
                
                fwrite(global.primes,sizeof(unsigned long long),MEM_PRIMES,global.pfile);
                fclose(global.pfile);
                global.index = 0U;
                global.nrec++;    
            }    
        }    
    }
    
    if(total>=MEM_PRIMES)
        put_primes();
    if(global.index)
        for(size_t i=0;i<global.index;i++)
        {
            if(i%5 == 0)
                printf("\n");
            printf("%12llu",global.primes[i]);    
        }
       
    if(total>MEM_PRIMES)
        if(remove(global.path))
            printf("\n删除文件失败\n");
        else
            printf("\n文件已删除\n");
    
    system("pause");
    return 0;    
}

int test_prime(unsigned long long N)
{
    unsigned long long buffer[MEM_PRIMES];
    int k = 0;
    if(global.nrec > 0)
    {
        if(!(global.pfile = fopen(global.path,"rb")))
        {
            printf("\n读取文件失败\n");
            system("pause");
            exit(1);    
        }
        for(size_t i=0; i < global.nrec ; i++)
        {
            fread(buffer,sizeof(unsigned long long),MEM_PRIMES,global.pfile);
            if((k = check(buffer,MEM_PRIMES,N)) >= 0) 
            {
                fclose(global.pfile);
                return k;    
            }   
        }
        fclose(global.pfile);    
    }
    return check(global.primes,global.index,N);
}

int check(unsigned long long buffer[],size_t count,unsigned long long N)
{
    unsigned  long long root_N = (unsigned long long)(1.0 + sqrt(N));
    for(size_t i=0;i<count;i++)
    {
        if(N % buffer[i] == 0ULL)
            return 0;
        if(buffer[i] > root_N)
            return 1;    
    }
    return -1;
}

void put_primes(void)
{
    unsigned long long buffer[MEM_PRIMES];
    if(!(global.pfile = fopen(global.path,"rb")))
    {
        printf("\n读取文件失败\n");
        system("pause");
        exit(1);    
    }
    for(size_t i=0U; i < global.nrec ; i++)
    {
         fread(buffer,sizeof(unsigned long long),MEM_PRIMES,global.pfile);
         
         for(size_t j=0;j<MEM_PRIMES;j++)
         {
            if(j%5==0)
                printf("\n");
            printf("%12llu",buffer[j]);       
         }
            
    }
    fclose(global.pfile);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值