Печать треугольника паскаль в С
void Pascal(int n){
int i,j;
int a[100], b[100];
a[0]= 1;
for(i = 0; i <= n; i++){
printf(" ");
b[i]=1;
for(j = 0; j <= i; j++){
if (j <= 1) a[j-1]=0;
b[j] = a[j-1] + a[j];
printf("%d", b[j]);
}
for (j = 0; j <= i; j++){
a[j] = b[j];
}
printf("%d \n");
}
}
Это функция, которую я пытался построить; подскажите пожалуйста что с ним не так?
4 ответа
В строке 11 вы используете -1 в качестве индекса. Проверьте это сначала. Проверьте код
void Pascal(int n){
int i,j;
int a[100]={0}, b[100]={0};
a[1]= 1;
for (i = 1; i <= n; i++){
printf(" ");
b[i]=1;
for (j = 1; j <= i; j++){
if (j <= 1) a[j-1]=0;
b[j] = a[j-1] + a[j];
printf("%d ", b[j]);
}
for (j = 1; j <= i; j++){
a[j] = b[j];
}
printf("\n");
}
}
Я начал индексирование с 1.
Я сделал похожую программу:
#include <stdio.h>
int nk (int n, int k)
{
int erg = 0;
erg = fak(n)/(fak(k)*fak(n-k));
return (erg);
}
int fak (int n)
{
if (n==0)
return 1;
if (n==1)
return 1;
else
return n = n*fak(n-1);
}
int main ()
{
int n = 0;
int k = 0;
int s = 0;
int i = 0;
int a = 0;
printf ("How many rows: ");
scanf ("%d", &a);
s = (a-1);
printf ("\nPascal'sches Dreieck\n");
for (n = 0; n <= (a-1); n++)
{
for (i=0; i<=s; i++)
printf(" ");
for (k=0; k<=n; k++ )
{
if (nk(n,k)<=10)
printf (" %d ", nk(n,k));
else
printf (" %d", nk(n,k));
}
s--;
printf ("\n");
}
getch();
return 0;
}
подскажите пожалуйста что с ним не так?
С моей точки зрения, в общем, что не так с этим, что вы копируете содержимое массива b
в массив a
на каждой итерации:
for (j = 0; j <= i; j++) {
a[j] = b[j];
}
Это именно та ненужная перестановка памяти, которую нам позволяют избегать указатели! Итак, давайте обратимся к этой проблеме, и пока мы занимаемся этим, исправим все другие маленькие ошибки в коде:
void pascal(int n) {
int a[100], b[100]; // size appropriately or allocate dynamically
int *a_ptr = a, *b_ptr = b;
for (int i = 0; i < n; i++) {
b_ptr[0] = b_ptr[i] = 1; // initialize both ends
printf("%d ", b_ptr[0]); // print the left end
for (int j = 1; j < i; j++) { // compute & print the middle
b_ptr[j] = a_ptr[j] + a_ptr[j - 1];
printf("%d ", b_ptr[j]);
}
if (i > 0) { // print the right end if it's not also the left end
printf("%d", b_ptr[i]);
}
printf("\n");
int *temporary = a_ptr; // swap a_ptr and b_ptr
a_ptr = b_ptr;
b_ptr = temporary;
}
}
Попробуйте этот код!
Я также прилагаю скриншот вывода.
/ ************************************************* *****************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
void Pascal(int n);
int main()
{
int rows, coef = 1, space;
printf("Enter number of rows: ");
scanf("%d",&rows);
Pascal(rows);
return 0;
}
void Pascal(int rows)
{
int coef = 1, space;
for(int i=0; i<rows; i++)
{
for(space=1; space <= rows-i; space++)
printf(" ");
for(int j=0; j <= i; j++)
{
if (j==0 || i==0)
coef = 1;
else
coef = coef*(i-j+1)/j;
printf("%4d", coef);
}
printf("\n");
}
}