密码工程-小素数

任务详情

  1. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,使用git管理过程,至少提交三次

  2. 参考《密码工程》p107伪代码基于Eratosthenes算法实现 int SmallPrimeList(int n, int *plist, int *len), 其中plist返回素数列表,len返回列表长度(5’)

  3. 写出测试代码,至少包括 n=2, n=你的四位学号,n>2^20次方的测试代码,提交代码和运行结果截图,git log截图(10)

  4. 提交使用Markdown并转为PDF,或者使用doc,docx格式

任务内容

1、测试代码

点击查看代码
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
// 标记函数,用于标记合数  
void markComposites(int *isPrime, int n) {  
    for (int p = 2; p * p <= n; ++p) {  
        if (isPrime[p]) {  
            for (int i = p * p; i <= n; i += p) {  
                isPrime[i] = 0; // 标记为合数  
            }  
        }  
    }  
}  
  
// 生成小于等于n的所有素数列表  
int SmallPrimeList(int n, int *plist, int *len) {  
    // 如果n小于2,没有素数  
    if (n < 2) {  
        *len = 0;  
        return 0;  
    }  
  
    // 分配内存来标记是否为素数  
    int *isPrime = (int *)calloc(n + 1, sizeof(int));  
    if (isPrime == NULL) {  
        return -1; // 分配内存失败  
    }  
  
    // 初始化所有数字为素数(除了0和1)  
    for (int i = 2; i <= n; ++i) {  
        isPrime[i] = 1;  
    }  
  
    // 标记合数  
    markComposites(isPrime, n);  
  
    // 填充plist并计算素数数量  
    int count = 0;  
    for (int i = 2; i <= n; ++i) {  
        if (isPrime[i]) {  
            plist[count++] = i;  
        }  
    }  
  
    // 释放内存  
    free(isPrime);  
  
    // 设置返回的长度  
    *len = count;  
  
    return 0; // 成功  
}  
  
int main() {  
    int n;  
    printf("Enter a positive integer n (not greater than 2^20): ");  
    scanf("%d", &n); // 从用户处获取输入  
  
    // 检查输入是否为正整数且不超过2的20次方  
    const int MAX_N = 1 << 20; // 2的20次方  
    if (n <= 0 || n > MAX_N) {  
        printf("n must be a positive integer less than or equal to 2^20.\n");  
        return 1; // 输入错误,退出程序  
    }  
  
    // 根据n的大小动态分配plist的内存  
    int *plist = (int *)malloc(MAX_N * sizeof(int)); // 分配足够的空间来容纳最多MAX_N个素数  
    if (plist == NULL) {  
        printf("Memory allocation failed.\n");  
        return 1; // 内存分配失败,退出程序  
    }  
  
    int len = 0;  
  
    // 生成素数列表  
    int result = SmallPrimeList(n, plist, &len);  
    if (result == 0) {  
        printf("Prime numbers less than or equal to %d are:\n", n);  
        for (int i = 0; i < len; ++i) {  
            printf("%d ", plist[i]);  
        }  
        printf("\n");  
    } else {  
        printf("Error occurred during prime number generation.\n");  
    }  
  
    // 释放plist内存  
    free(plist);  
  
    return 0;  
}
2、测试结果

image

posted @ 2024-06-06 15:15  20211316郭佳昊  阅读(9)  评论(0编辑  收藏  举报