Как улучшить работу программы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ув. эксперты помогите улучшить работу программы....
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
#define MAX_L 32
#define POW 100000
#define MAX_N 100
#define MAX_K 10
 
struct long_def
{
  int l;
  int a[MAX_L];
};
typedef struct long_def long_t;
 
FILE *fi, *fo;
int dig[MAX_K];
long_t ans_def;
long_t *ans;
int ar_1[MAX_N*MAX_K + 1];
int ar_2[MAX_N*MAX_K + 1];
int *a, *b, *t;
int N, K;
 
int min (int a, int b) { return (a<b)?a:b; }
int max (int a, int b) { return (a>b)?a:b; }
 
long_t *
zero (long_t *x)
{
  int i;
  x->l = 0;
  for (i = 0; i < MAX_L; i++)
    x->a[i] = 0;
  return x;
}
 
long_t *
one (long_t *x)
{
  zero (x);
  x->l = 1;
  x->a[0] = 1;
  return x;
}

long_t *
add_long (long_t *x, long_t *y, long_t *z)
{
  int i, r, l;
  l = max (x->l, y->l);
  r = 0;
  for (i = 0; i < l; i++)
    {
      z->a[i] = x->a[i] + y->a[i] + r;
      r = z->a[i] / POW;
      z->a[i] %= POW;
    }
  while (r > 0)
    {
      z->a[l++] = r % POW;
      r /= POW;
    }
  z->l = l;
  return z;
}
 
long_t *
mul_long (long_t *x, int q, long_t *z)
{
  int i, r, l;
  l = x->l;
  r = 0;
  for (i = 0; i < l; i++)
    {
      z->a[i] = x->a[i] * q + r;
      r = z->a[i] / POW;
      z->a[i] %= POW;
    }
  while (r > 0)
    {
      z->a[l++] = r % POW;
      r /= POW;
    }
  z->l = l;
  return z;
}
 
long_t *
div_long (long_t *x, int q, long_t *z)
{
  int i, r, l;
  l = x->l;
  r = 0;
  for (i = l - 1; i >= 0; i--)
    {
      z->a[i] = r * POW + x->a[i];
      r = z->a[i] % q;
      z->a[i] /= q;
    }
  while ((l > 0) && (z->a[l-1] == 0))
    l--;
  z->l = l;
  return z;
}
 
void
write_long (long_t *x)
{
  int i, l;
  l = x->l;
  fprintf (fo, "%d", x->a[l - 1]);
  for (i = l - 2; i >= 0; i--)
    {
      fprintf (fo, "%05d", x->a[i]);
    }
  fprintf (fo, "\n");
}
 
void
count (void)
{
  int i, j, d, n;
  int s;
  long_t tmp_def;
  long_t *tmp = &tmp_def;
  a = ar_1;
  b = ar_2;
  s = 0;
  for (i = 1; i <= K; i++)
    s += dig[i] * i;
  if (!(s%2))
    {
      for (i = 0; i <= s/2; i++)
    {
      a[i] = 0;
    }
      a[0] = 1;
      for (d = K; d > 0; d--)
    {
      for (i = 0; i <= s/2; i++)
        b[i] = a[i];
      for (i = 0; i <= s/2; i++)
        {
          if (!a[i]) continue;
          for (j = 0; j <= dig[d]; j++)
        {
          b[i + j*d] = 1;
        }
       }
      t = a; a = b; b = t;
    }
    }
  if ((!a[s/2]) || (s%2))
    {
      n = N;
      one (tmp);
      for (d = 0; d <= K; d++)
    {
      for (i = n - dig[d] + 1; i <= n; i++)
        mul_long (tmp, i, tmp);
      for (i = 2; i <= dig[d]; i++)
        div_long (tmp, i, tmp);
      n -= dig[d];
    }
      add_long (ans, tmp, ans);
    }
}
 
void
gen (int d, int s)
{
  int i;
  if (s > N) return;
  if (d > K)
    {
      dig[0] = N - s;
      count ();
      return ;
    }
  for (i = 0; i <= N - s; i++)
    {
      dig[d] = i;
      gen (d + 1, s + i);
    }
}
 
int
main (void)
{
  fi = fopen ("input.txt", "rt");
  fo = fopen ("output.txt", "wt");
  ans = &ans_def;
  while (1)
    {
      if (fscanf (fi, "%d%d", &N, &K) < 2) break;
      zero (ans);
      gen (1, 0);
      write_long (ans);
    }
 
  fclose (fi);
  fclose (fo);
  return 0;
}

Решение задачи: «Как улучшить работу программы»

textual
Листинг программы
gen (int d, int s)
{
  ...
  for (i = 0; i <= N - s; i++)
    {
      dig[d] = i;
      gen (d + 1, s + i);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы