diff --git a/exercises/01_helloworld.c b/exercises/01_helloworld.c index e6100166bcb8fd1064fc94f2bb0e1a6952ba8bd1..cc920be536287951c172cbcabdc72a01a70ecba4 100644 --- a/exercises/01_helloworld.c +++ b/exercises/01_helloworld.c @@ -2,7 +2,7 @@ int main(){ - // Print "Hello World!" to the console + printf("Hello, World!\n"); diff --git a/exercises/02_loop.c b/exercises/02_loop.c index 3e361e61656c2d9ea05348a15fa275dcd3201b8a..73409d1bb1a4c08d014ab6e510b19468feb8b654 100644 --- a/exercises/02_loop.c +++ b/exercises/02_loop.c @@ -7,7 +7,9 @@ int main(void) { - //TODO +for (int i = 1; i <= 10; ++i) { + printf("%d\n", i); + } return 0; } \ No newline at end of file diff --git a/exercises/03_nested_loops.c b/exercises/03_nested_loops.c index d80c6903dd22e3305e35ff2bfb82f949e9975617..367eb5b97262a0b09883bbe5eee54f0f564b89d4 100644 --- a/exercises/03_nested_loops.c +++ b/exercises/03_nested_loops.c @@ -11,7 +11,12 @@ int main(void) { - //TODO +for (int i = 1; i <= 9; ++i) { + for (int j = 1; j <= i; ++j) { + printf("%d*%d=%d\t", j, i, i * j); + } + printf("\n"); + } return 0; } \ No newline at end of file diff --git a/exercises/04_prime_number.c b/exercises/04_prime_number.c index 28e3f5f8cd5dbb074c60d947c925a13d8918234e..77b8428995ab5b12db14b5c9b482881f96446ef3 100644 --- a/exercises/04_prime_number.c +++ b/exercises/04_prime_number.c @@ -10,8 +10,22 @@ int main(void) for (i = 1; i <= 100; i++) { - //TODO - } + int is_prime = 1; // 假设当前数字是素数 + + for (j = 2; j <= sqrt(i); j++) + { + if (i % j == 0) + { + is_prime = 0; // 不是素数 + break; + } + } + + if (is_prime && i > max) + { + max = i; // 更新最大素数 + } + } printf("max = %d\n", max); diff --git a/exercises/05_josephus_ring.c b/exercises/05_josephus_ring.c index 330f2045f5cda70d21728503ef40accd04cea14f..ff9703d41d5a021b3a1799c52443712f43592c81 100644 --- a/exercises/05_josephus_ring.c +++ b/exercises/05_josephus_ring.c @@ -1,29 +1,50 @@ #include - -/** - * 给定100个人站成一圈,从第1个人开始依次报数。 - * 每数到3的人将会被淘汰,然后继续从下一个人开始报数。 - * 这个过程会一直持续,直到所有的人都被淘汰。 - * 请编写一个C语言程序来模拟这个过程,并且输出每一个被淘汰人的编号。 - * 要求:输出每一个被淘汰人的编号,每淘汰一个人输出一行,格式为:"%d out \n"(每输出一次换行) -*/ +#include #define ALL_NUM 100 #define COUNT_NUM 3 -#define OUT_NUM 3 -/* people id array such as (1,2,3,4,5,6) */ -int people[ALL_NUM]; +// 定义循环链表节点 +struct Node { + int id; + struct Node* next; +}; -int main(void) -{ - int left; /* 剩余人数 */ - int pos; /* 当前报数位置 */ - int step; /* 当前报数 */ +// 创建循环链表 +struct Node* createCircle(int n) { + struct Node* head = NULL; + struct Node* prev = NULL; + for (int i = 1; i <= n; ++i) { + struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); + newNode->id = i; + if (head == NULL) { + head = newNode; + } else { + prev->next = newNode; + } + prev = newNode; + } + prev->next = head; // 链接成循环 + return head; +} - //TODO - - +// 模拟报数并淘汰 +void josephus(struct Node* head) { + struct Node* current = head; + while (current->next != current) { + for (int i = 1; i < COUNT_NUM; ++i) { + current = current->next; + } + struct Node* eliminated = current->next; + printf("%d out\n", eliminated->id); + current->next = eliminated->next; + free(eliminated); + } + printf("Last person standing: %d\n", current->id); +} - return 0; -} \ No newline at end of file +int main(void) { + struct Node* circle = createCircle(ALL_NUM); + josephus(circle); + return 0; +}