Я студент-программист, и в следующем семестре я собираюсь начать курс C. Поэтому, чтобы немного подготовиться, я начал изучать С сам и наткнулся на интересную задачу, предназначенную, как мне показалось, на первый взгляд, не очень продвинутый уровень.Треугольник Паскаля в C
Задача состоит в том, чтобы написать программу для вычисления значения данной позиции в Треугольник Паскаля. И формула, заданная для вычисления, написана как element = row!/(Позиция * (строка - позиция!))
Я написал простую консольную программу, которая, кажется, работает хорошо, пока я не получаю, чтобы испытывать его с больших чисел.
При попытке этой программы с строкой 16 и позицией 3 она вычисляет значение как 0, хотя очевидно, что такого значения не может (на самом деле оно должно вычислять значение как 560), все ячейки этого треугольник должен быть целым числом и быть больше одного.
Я полагаю, что у меня возникла проблема с хранением и обработкой больших чисел. Факториальная функция, похоже, работает нормально, и используемая мной формула работает до тех пор, пока я не получу попытку больших чисел.
Пока лучшее решение было найдено здесь - How do you printf an unsigned long long int(the format specifier for unsigned long long int)? с использованием библиотеки inttypes.h с типом uint64_t, но это все еще не дает мне нужен результат.
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
void clear_input(void);
uint64_t factorial(int x);
int main()
{
// Printing
printf("This program computes the value of a given position in Pascal's Triangle.\n");
printf("You will be asked for row and position of the value.\n");
printf("Note that the rows and positions starts from 0.\n");
printf("\n");
printf(" 1 * 0 \n");
printf(" 1 1 * 1 \n");
printf(" 1 2 1 * 2 \n");
printf(" 1 3 3 1 * 3 \n");
printf(" 1 4 6 4 1 * 4 \n");
printf(" **************** \n");
printf(" 0 1 2 3 4 \n");
printf("\n");
// Initializing
int row, pos;
// Input Row
printf("Enter the row: ");
scanf("%d", &row);
clear_input();
// Input Position
printf("Enter the position in the row: ");
scanf("%d", &pos);
clear_input();
// Initializing
uint64_t element, element_1, element_2, element_3, element_4;
// Previously written as -> element = (factorial(row))/(factorial(pos) * factorial(row - pos));
// Doesn't fix the problem
element_1 = factorial(row);
element_2 = factorial(pos);
element_3 = factorial(row - pos);
element_4 = element_2 * element_3;
element = element_1/element_4;
// Print result
printf("\n");
printf("%"PRIu64"\n", element_1); // Temporary output
printf("%"PRIu64"\n", element_2); // Temporary output
printf("%"PRIu64"\n", element_3); // Temporary output
printf("%"PRIu64"\n", element_4); // Temporary output
printf("\n");
printf("The element is %"PRIu64"", element);
printf("\n");
return 0;
}
void clear_input(void) // Temporary function to clean input from the keyboard
{
while(getchar() != '\n');
}
uint64_t factorial(int x) // Function to calculate factorial
{
int f = 1, i = x;
if (x == 0) {
return 1;
}
while (i != 1) {
f = f * i;
i = i - 1;
}
return f;
}
Если вы используете большое количество (> 32 бит), то с помощью 'int' собирается получить вас неправильные результаты. Если вы используете тип данных 'uint64_t' для указания типа возврата, для вычисления вашего расчета вам нужно использовать тот же тип данных. Теперь ваша функция использует 'int' внутри, и результат неявно приводится к' uint64_t', что на самом деле вам не поможет. –