#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;
}