
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
>>3435 (OP)
Молодец. Теперь ещё прикрути gmp и какой-нибудь IPC, хоть даже разделяемую память. А потом ещё попробуй переписать на openmp.
Молодец. Теперь ещё прикрути gmp и какой-нибудь IPC, хоть даже разделяемую память. А потом ещё попробуй переписать на openmp.