第一题

个人总结:纯素数可通过递归构建。1维纯素数为2、3、5、7。对每个低维纯素数,在末尾尝试添加1-9(不能加0,因为末位0的数不可能是素数),若新数为素数则得到高维纯素数。递归生成所有8维以内的纯素数并存储,根据输入的维度T直接输出对应结果。
代码如下:
#include <stdio.h>
#include <math.h>
#include <string.h>
int isPrime(int num) {
if (num < 2) return 0;
if (num == 2) return 1;
if (num % 2 == 0) return 0;
int limit = (int)sqrt(num);
for (int i = 3; i <= limit; i += 2) {
if (num % i == 0) return 0;
}
return 1;
}
int results[9][1000];
int counts[9] = {0};
void generatePurePrimes(int current, int digits) {
results[digits][counts[digits]++] = current;
if (digits == 8) return;
for (int digit = 1; digit <= 9; digit++) {
int nextNum = current * 10 + digit;
if (isPrime(nextNum)) {
generatePurePrimes(nextNum, digits + 1);
}
}
}
int main() {
for (int i = 0; i < 9; i++) {
counts[i] = 0;
}
int oneDigitPrimes[] = {2, 3, 5, 7};
for (int i = 0; i < 4; i++) {
generatePurePrimes(oneDigitPrimes[i], 1);
}
int N;
scanf("%d", &N);
for (int caseNum = 0; caseNum < N; caseNum++) {
int T;
scanf("%d", &T);
for (int i = 0; i < counts[T]; i++) {
printf("%d\n", results[T][i]);
}
}
return 0;
}
第二题

个人总结:汉诺塔移动可用递归模拟。将n个盘子从A移到C需2ⁿ-1步。递归函数模拟:先将n-1个盘子从源杆移到辅助杆,再移动最大盘子,最后将n-1个盘子从辅助杆移到目标杆。每移动一步计数,当计数等于m时记录移动方向并返回。若m超出总步数则输出"none"。
代码如下:
#include <stdio.h>
int findMove(int n, int m, char from, char to, char aux, int *step, char *src, char *dst) {
if (n == 1) {
(*step)++;
if (*step == m) {
*src = from;
*dst = to;
return 1;
}
return 0;
}
if (findMove(n - 1, m, from, aux, to, step, src, dst))
return 1;
(*step)++;
if (*step == m) {
*src = from;
*dst = to;
return 1;
}
if (findMove(n - 1, m, aux, to, from, step, src, dst))
return 1;
return 0;
}
int main() {
int n, m;
while (scanf("%d %d", &n, &m) == 2) {
int step = 0;
char src, dst;
int totalSteps = (1 << n) - 1; // 2^n - 1
if (m < 1 || m > totalSteps) {
printf("none\n");
continue;
}
if (findMove(n, m, 'A', 'C', 'B', &step, &src, &dst)) {
printf("%c--%c\n", src, dst);
} else {
printf("none\n");
}
}
return 0;
}
第三题

个人总结:将数字按自定义规则排序:比较两个数字a和b的拼接结果a+b与b+a,若a+b > b+a则a排在b前面。使用qsort函数实现排序,数字用字符串存储避免溢出。排序后按顺序拼接所有字符串即为能组成的最大整数。
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_N 50
#define MAX_LEN 100
char numbers[MAX_N][MAX_LEN];
int compare(const void *a, const void *b) {
char str1[MAX_LEN * 2], str2[MAX_LEN * 2];
strcpy(str1, (char*)a);
strcat(str1, (char*)b);
strcpy(str2, (char*)b);
strcat(str2, (char*)a);
return strcmp(str2, str1);
}
int main() {
int N;
while (1) {
scanf("%d", &N);
if (N == 0) break;
for (int i = 0; i < N; i++) {
scanf("%s", numbers[i]);
}
qsort(numbers, N, MAX_LEN, compare);
for (int i = 0; i < N; i++) {
printf("%s", numbers[i]);
}
printf("\n");
}
return 0;
}
翻译
支持 Java 的浏览器(如 HotJava¹)允许用户控制 Java 软件对本地系统的访问。当 Java 小应用程序需要权限来访问本地资源(如文件)时,会向用户弹出一个安全对话框,请求用户明确授权。这种"先问许可"的方式确保了用户在系统安全方面始终拥有最终决定权。
- Java 是多线程的
与 Ada 类似,而不同于其他语言,Java 为多线程提供了内置的语言支持。多线程允许在单个程序中同时执行多个执行线程。这使得你的程序可以同时完成多项任务:让 Duke 图标跳舞、播放用户喜爱的曲调,并与用户交互,看起来就像在同一时间完成所有操作。
多线程是一项重要优势,因为它允许程序员将程序编写为独立的线程,而不是一堆相互交织的复杂活动。多线程还允许 Java 利用 CPU 空闲时间执行必要的垃圾回收和常规系统维护,使这些功能在执行时对程序性能的影响更小。
单词打卡
