Главная Юзердоски Каталог Трекер NSFW Настройки

Программы

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 3 1 2
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdint.h&gt; #include &lt;unistd.h&g Аноним (Microsoft Windows 10: Chromium based) 11/02/25 Втр 15:30:43 3583435 1
image.png 34Кб, 180x183
180x183
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

// Функция для вычисления числа Фибоначчи
uint64_t fibonacci(uint64_t n, int overflow) {
if (n == 0) return 0;
if (n == 1) return 1;

uint64_t a = 0, b = 1, temp;
for (uint64_t i = 2; i <= n; i++) {
if (b > UINT64_MAX - a) { // Проверка на переполнение
overflow = 1;
return 0;
}
temp = a + b;
a = b;
b = temp;
}
return b;
}

// Функция для вычисления факториала
uint64_t factorial(uint64_t n, int overflow) {
if (n == 0 || n == 1) return 1;

uint64_t result = 1;
for (uint64_t i = 2; i <= n; i++) {
if (result > UINT64_MAX / i) { // Проверка на переполнение
overflow = 1;
return 0;
}
result = i;
}
return result;
}

int main(int argc, char
argv[]) {
if (argc != 2) {
fprintf(stderr, "Использование: %s <число>\n", argv[0]);
return EXIT_FAILURE;
}

uint64_t num = strtoull(argv[1], NULL, 10);
if (num == 0 && argv[1][0] != '0') {
fprintf(stderr, "Ошибка: некорректный ввод\n");
return EXIT_FAILURE;
}

pid_t pid = fork();

if (pid < 0) {
perror("Ошибка при fork");
return EXIT_FAILURE;
}

if (pid == 0) { // Дочерний процесс: вычисляет факториал
int overflow = 0;
uint64_t fact = factorial(num, &overflow);
if (overflow) {
printf("Факториал(%llu) вызвал переполнение!\n", num);
} else {
printf("Факториал(%llu) = %llu\n", num, fact);
}
exit(0);
} else { // Родительский процесс: вычисляет Фибоначчи
int overflow = 0;
uint64_t fib = fibonacci(num, &overflow);
if (overflow) {
printf("Фибоначчи(%llu) вызвал переполнение!\n", num);
} else {
printf("Фибоначчи(%llu) = %llu\n", num, fib);
}
wait(NULL); // Ожидание завершения дочернего процесса
}

return EXIT_SUCCESS;
}
Аноним (Microsoft Windows 10: Chromium based) 11/02/25 Втр 15:35:20 3583438 2
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h> // Добавлено для корректного вывода uint64_t
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

uint64_t fibonacci(uint64_t n, int overflow) {
if (n == 0) return 0;
if (n == 1) return 1;

uint64_t a = 0, b = 1, temp;
for (uint64_t i = 2; i <= n; i++) {
if (b > UINT64_MAX - a) {
overflow = 1;
return 0;
}
temp = a + b;
a = b;
b = temp;
}
return b;
}

uint64_t factorial(uint64_t n, int overflow) {
if (n == 0 || n == 1) return 1;

uint64_t result = 1;
for (uint64_t i = 2; i <= n; i++) {
if (result > UINT64_MAX / i) {
overflow = 1;
return 0;
}
result = i;
}
return result;
}

int main(int argc, char
argv[]) {
if (argc != 2) {
fprintf(stderr, "Использование: %s <число>\n", argv[0]);
return EXIT_FAILURE;
}

uint64_t num = strtoull(argv[1], NULL, 10);
if (num == 0 && argv[1][0] != '0') {
fprintf(stderr, "Ошибка: некорректный ввод\n");
return EXIT_FAILURE;
}

pid_t pid = fork();

if (pid < 0) {
perror("Ошибка при fork");
return EXIT_FAILURE;
}

if (pid == 0) {
int overflow = 0;
uint64_t fact = factorial(num, &overflow);
if (overflow) {
printf("Факториал(%" PRIu64 ") вызвал переполнение!\n", num);
} else {
printf("Факториал(%" PRIu64 ") = %" PRIu64 "\n", num, fact);
}
exit(0);
} else {
int overflow = 0;
uint64_t fib = fibonacci(num, &overflow);
if (overflow) {
printf("Фибоначчи(%" PRIu64 ") вызвал переполнение!\n", num);
} else {
printf("Фибоначчи(%" PRIu64 ") = %" PRIu64 "\n", num, fib);
}
wait(NULL);
}

return EXIT_SUCCESS;
}
Аноним (Linux: Firefox based) 22/02/25 Суб 15:00:14 3585439 3
>>3583435 (OP)
Молодец. Теперь ещё прикрути gmp и какой-нибудь IPC, хоть даже разделяемую память. А потом ещё попробуй переписать на openmp.
Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов