任务详情
-
在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务,使用git管理过程,至少提交三次
-
参考《密码工程》p107伪代码基于Eratosthenes算法实现 int SmallPrimeList(int n, int *plist, int *len), 其中plist返回素数列表,len返回列表长度(5’)
-
写出测试代码,至少包括 n=2, n=你的四位学号,n>2^20次方的测试代码,提交代码和运行结果截图,git log截图(10)
-
提交使用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;
}