#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义结果存储结构(链表节点)
typedef struct Node {
int data;
struct Node* next;
} Node;
// 检查数字是否包含字符'4'
bool hasDigitFour(int num) {
while (num > 0) {
if (num % 10 == 4) {
return true;
}
num /= 10;
}
return false;
}
// 检查数字是否是4的倍数
bool isMultipleOfFour(int num) {
return num % 4 == 0;
}
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
fprintf(stderr, "内存分配失败!\n");
exit(1);
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 向链表尾部添加节点
void appendNode(Node** head, int value) {
Node* newNode = createNode(value);
if (*head == NULL) {
*head = newNode;
return;
}
Node* curr = *head;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newNode;
}
// 遍历并打印链表
void printLinkedList(Node* head) {
Node* curr = head;
while (curr != NULL) {
printf("%d\n", curr->data);
curr = curr->next;
}
}
// 释放链表内存
void freeLinkedList(Node* head) {
Node* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
// 主逻辑:生成符合条件的数字并存储到链表
Node* generateValidNumbers(int n) {
Node* resultList = NULL;
for (int i = 1; i <= n; i++) {
if (!hasDigitFour(i) && !isMultipleOfFour(i)) {
appendNode(&resultList, i);
}
}
return resultList;
}
int main() {
int n;
if (scanf("%d", &n) != 1 || n < 1 || n > 100000) {
fprintf(stderr, "输入不合法!请输入1到100000之间的正整数。\n");
return 1;
}
Node* validList = generateValidNumbers(n);
printLinkedList(validList);
freeLinkedList(validList);
return 0;
}