М.Двач / Программы

34 Кб, 180x183
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h&g Windows 10: Chromium based 11 фев, 15:30 3583435 В конец треда | Веб

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

Ответы5439

Windows 10: Chromium based 2 11 фев, 15:35 2 3583438

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

Windows 10: Chromium based 2 11 фев, 15:35 2 3583438

#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 3 22 фев, 15:00 3 3585439

>>3583435 (OP)
Молодец. Теперь ещё прикрути gmp и какой-нибудь IPC, хоть даже разделяемую память. А потом ещё попробуй переписать на openmp.

Обновить тред

« /s/В начало тредаВеб-версияНастройки

/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.gq, m2ch.cf, m2ch.fapp.in, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion