将2-4000中的所有素数分别输出到两个文件中

将2-4000中的所有素数分别输出到两个文件中,一个是文本文件,另一个是二进制文件;读出文件中的内容输出(每行10列)。

#include <stdio.h>
#include <stdbool.h>

#define MAX_NUM 4000

// 判断一个数是否为素数
bool is_prime(int num)
{
    if (num < 2)
        return false;
    for (int i = 2; i * i <= num; i++)
    {
        if (num % i == 0)
            return false;
    }
    return true;
}

// 将素数写入文本文件和二进制文件
void write_primes()
{
    FILE *txt_fp = fopen("primes.txt", "w");
    FILE *bin_fp = fopen("primes.bin", "wb");

    if (txt_fp == NULL || bin_fp == NULL)
    {
        printf("打开文件失败\n");
        return;
    }

    for (int i = 2; i <= MAX_NUM; i++)
    {
        if (is_prime(i))
        {
            // 写入文本文件
            fprintf(txt_fp, "%d ", i);

            // 写入二进制文件
            fwrite(&i, sizeof(int), 1, bin_fp);
        }
    }

    fclose(txt_fp);
    fclose(bin_fp);
}

// 从文件中读取素数并输出
void read_primes()
{
    FILE *txt_fp = fopen("primes.txt", "r");
    FILE *bin_fp = fopen("primes.bin", "rb");

    if (txt_fp == NULL || bin_fp == NULL)
    {
        printf("打开文件失败\n");
        return;
    }

    // 从文本文件中读取素数并输出
    printf("\n从text文件读取:\n");
    int count = 0;
    int num;
    while (fscanf(txt_fp, "%d", &num) != EOF)
    {
        printf("%-8d", num);
        count++;
        if (count % 10 == 0)
            printf("\n");
    }
    printf("\n");

    // 从二进制文件中读取素数并输出
    printf("\n从二进制文件读取:\n");
    count = 0;
    while (fread(&num, sizeof(int), 1, bin_fp) > 0)
    {
        printf("%-8d", num);
        count++;
        if (count % 10 == 0)
            printf("\n");
    }
    printf("\n");

    fclose(txt_fp);
    fclose(bin_fp);
}

int main()
{
    write_primes();
    read_primes();

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7582412
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:从键盘输入一个小于1000的正数,要求输出他的平方根(如果平方根不是整数,则输出其整数部分)
  • 除此之外, 这篇博客: 错题改错及分析中的 (4)将一个从键盘输入的整数存放到一个数组中,通过程序的运行按照数组中的逆序输出该整数,利用递归的方法解决问题。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    正确代码:

    #include <stdio.h>
    int fun(char s[],int n)
    {
        int i;
        if((i=n/10)!=0)
             fun(s+1,i);
        *s=n%10+'0';
        return 0;
    }
    int main()
    {
        int num;
        char str[10]=" ";
        printf("input integer data:");
        scanf("%d",&num);
        fun(str,num);
        printf("output string:\n");
        puts(str);
        return 0;
    }
    

    思路分析:
    (1)设计函数实现数据的逆序存放,设定形参数组接收实参数组的地址,来存储数据的每一位。
    (2)函数体采用递归的方式解决问题,因此考虑递归进行的条件。例如,把数据 n 存放到数组 s 中,若 n 是一位数,则存放 n 到数组中;若 n 不是一位数,则存放 n/10 到数组中。
    (3)问题解决的难点在于找到数据的存放地址,通过不断地取余和整除 10 来得到数据的每一位。为了实现数据的逆序存放,每一次整除 10 的时候,同时把存放数据的数组地址后移,这样得到的第一位数存放在数组的最后一位……通过依次前移,即递归的回归,实现整个数据的存放。通过函数 fun() 实现字符串中的数字的逆序转换。

  • 您还可以看一下 张伟老师的实用数据分析:数据分析师从小白到精通课程中的 实战案例2:用户画像及用户留存分析小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    我可以解决这个问题。

    首先,需要编写一个函数来判断一个数字是否为素数。这可以通过循环判断该数字是否能被小于它的所有数字整除来实现。

    def is_prime(num):
        if num < 2:
            return False
        for i in range(2, num):
            if num % i == 0:
                return False
        return True
    

    接下来,我们可以使用该函数来找出所有范围内的素数,并将它们分别存储到文本文件和二进制文件中。在此过程中,我们可以使用Python内置的open函数来打开文件,并使用write方法将素数写入文件中。

    import struct
    
    lower_bound = 2
    upper_bound = 4000
    
    prime_nums = [num for num in range(lower_bound, upper_bound+1) if is_prime(num)]
    
    with open('prime_nums.txt', 'w') as f:
        for i, prime in enumerate(prime_nums):
            f.write(str(prime) + ' ')
            if (i+1) % 10 == 0:
                f.write('\n')
    
    with open('prime_nums.bin', 'wb') as f:
        for prime in prime_nums:
            f.write(struct.pack('i', prime))
    

    最后,我们可以编写一个函数来读取文件中的素数,并以每行10列的格式输出它们的值。

    def print_primes(file):
        with open(file, 'r') as f:
            primes = f.read().split()
            for i in range(0, len(primes), 10):
                print(' '.join(primes[i:i+10]))
    
    print_primes('prime_nums.txt')
    print_primes('prime_nums.bin')
    

    在运行程序时,需要用户输入数字范围的下界和上界。

    lower_bound = int(input("请输入数字范围的下界: "))
    upper_bound = int(input("请输入数字范围的上界: "))
    

    完整的代码如下。

    import struct
    
    def is_prime(num):
        if num < 2:
            return False
        for i in range(2, num):
            if num % i == 0:
                return False
        return True
    
    def print_primes(file):
        with open(file, 'r') as f:
            primes = f.read().split()
            for i in range(0, len(primes), 10):
                print(' '.join(primes[i:i+10]))
    
    lower_bound = int(input("请输入数字范围的下界: "))
    upper_bound = int(input("请输入数字范围的上界: "))
    
    prime_nums = [num for num in range(lower_bound, upper_bound+1) if is_prime(num)]
    
    with open('prime_nums.txt', 'w') as f:
        for i, prime in enumerate(prime_nums):
            f.write(str(prime) + ' ')
            if (i+1) % 10 == 0:
                f.write('\n')
    
    with open('prime_nums.bin', 'wb') as f:
        for prime in prime_nums:
            f.write(struct.pack('i', prime))
    
    print("Text file:")
    print_primes('prime_nums.txt')
    print("Binary file:")
    print_primes('prime_nums.bin')
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^