Advertisement
iocoder

pascal.c

Jun 6th, 2014
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.29 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <gui.h>
  3.  
  4. int all[2][1001][300]; /* 300 digit, 1001 nums, two arrays */
  5. int (*arr)[300] = all[0];
  6. int (*tmp)[300] = all[1];
  7. int count;
  8. pixbuf_t *pascal;
  9.  
  10. void init(int *num) {
  11.  
  12.     int i;
  13.     num[0] = 1;
  14.     for (i = 1; i < 300; i++)
  15.         num[i] = 0;
  16.  
  17. }
  18.  
  19. void sum(int *num1, int *num2, int *output) {
  20.  
  21.     int i, carry = 0;
  22.     for (i = 0; i < 300; i++) {
  23.         int sum = carry + num1[i] + num2[i];
  24.         output[i] = sum%10;
  25.         carry = sum/10;
  26.     }
  27.  
  28. }
  29.  
  30.  
  31. void generate(int k) {
  32.  
  33.     /* generate kth level */
  34.     if (k == 0) {
  35.         /* 0th level */
  36.         init(arr[0]); /* set first element to 1 */
  37.         count = 1;
  38.     } else {
  39.         int i = 0;
  40.         int (*swap)[300];
  41.         generate(k-1);
  42.         init(tmp[i++]); /* set first element to 1 */
  43.         for (; i < count; i++)
  44.             sum(arr[i], arr[i-1], tmp[i]);
  45.         init(tmp[i]); /* set last element to 1 */
  46.         count++;
  47.         swap = tmp;
  48.         tmp = arr;
  49.         arr = swap;
  50.     }
  51.  
  52. }
  53.  
  54. void print() {
  55.  
  56.     int i, j;
  57.     for (i = 0; i < count; i++) {
  58.         int f = 0;
  59.         for (j = 299; j >= 0; j--) {
  60.             if (arr[i][j] || f) {
  61.                 printf("%d", arr[i][j]);
  62.                 f = 1;
  63.             }
  64.         }
  65.         if (!f)
  66.             printf("%d", 0);
  67.         printf("\n");
  68.     }
  69.  
  70. }
  71.  
  72. int main() {
  73.  
  74.     int i, j;
  75.     window_t *win;
  76.  
  77.     generate(1000);
  78.     pascal = pixbuf_alloc(300, 1001);
  79.     for (i = 0; i < count; i++) {
  80.         for (j = 299; j >= 0; j--) {
  81.             int g = 255-((tmp[i][j]*255)/9);
  82.             int color = 0xFF000000 | (g<<16) | (g<<8) | g;
  83.             pixbuf_set_pixel(pascal, 299-j, i, color);
  84.         }
  85.     }
  86.  
  87.     win = window_alloc("Pascal Triangle",  /* title */
  88.                        300,                /* width */
  89.                        500,                /* height */
  90.                        -2,                 /* x (center) */
  91.                        -2,                 /* y (center) */
  92.                        0xFFC0C0C0,         /* bg color */
  93.                        "/usr/share/icons/launcher16.png" /* iconfile */);
  94.  
  95.     pixbuf_paint(pascal, win->pixbuf, 0, 0);
  96.  
  97.     window_flush(win, 0, 0, win->pixbuf->width, win->pixbuf->height);
  98.  
  99.     gui_loop();
  100.  
  101.     return 0;
  102.  
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement