Исходник перебора функций, числа m и n вводятся с клавиатуры


Добавил:DMT
Дата создания:25 апреля 2008, 12:13
Дата обновления:25 апреля 2008, 12:13
Просмотров:3107 последний сегодня, 10:54
Комментариев: 0

Исходник перебора функций, числа m и n вводятся с клавиатуры

Код на C++
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>
  4.  
  5. //#define m 4
  6. //#define n 2
  7. long kol=0;
  8.  
  9. int p(int *x, int k)
  10. //возвращает 1, если выполнены условия
  11. {
  12. int i,j;
  13. if (k==0) return 1;
  14. if (p(x,k-1)) //если среди предшествующих условие выполнено
  15. {
  16. if (!(x[k-1]>=x[k]))
  17. return 0;
  18. return 1;
  19. }
  20. else return 0;
  21. }
  22.  
  23. void main(void)
  24. {
  25. int *b; //верхние границы раскрашенных подмножеств
  26. //b[m+1] закрашивает элементы последнего
  27. //множества A-i равны 0, 1, 2, ..., n
  28. int *x; //генерируемая последовательность
  29. int i, k,m,n; //k - длина последней сгенерированной
  30. FILE *in=fopen("fanc.txt","w");
  31.  
  32. do
  33. {
  34. printf("введите числа m и n для первого и второго множества\nтакие, что m>=n\n");
  35. printf("число m ");
  36. scanf("%d",&m);
  37. printf("число n ");
  38. scanf("%d",&n);
  39. }
  40. while (m<n);
  41.  
  42. b = (int *)calloc(m+2,sizeof(int));
  43. x = (int *)calloc(m+1,sizeof(int));
  44.  
  45. for(i=0;i<=m;b[i]=-1,i++)
  46.  
  47. b[m+1]=n;
  48. k=0;
  49. while(k>=0)
  50. {
  51. if(b[k]<n)
  52. {
  53. x[k]=++b[k];
  54. if(p(x,k))
  55. {
  56. if (k==m)
  57. {
  58. for (i=0;i<=k;i++)
  59. fprintf(in," %d",x[i]);
  60. fprintf(in,"\n");
  61. kol++;
  62. }
  63. if(k<m) k++;
  64. }
  65. }
  66. else b[k--]=-1;
  67. }
  68.  
  69. printf("%ld",kol);
  70.  
  71. }
При использовании обязательна ссылка на http://DMTSoft.ru

Результат работы - файл fanc.txt:

0 0 0 0 0 0
1 0 0 0 0 0
1 1 0 0 0 0
1 1 1 0 0 0
1 1 1 1 0 0
1 1 1 1 1 0
1 1 1 1 1 1
2 0 0 0 0 0
2 1 0 0 0 0
2 1 1 0 0 0
2 1 1 1 0 0
2 1 1 1 1 0
2 1 1 1 1 1
2 2 0 0 0 0

up