
Code: Select all
g = g + s
s = 1
@++g, 0 DCGROUP oGroup2 CAPTION 'Задайте число признаков в сочетаниях:' SIZE 79.0, 13.6
@s+0.2, 2 DCSAY " 1" PARENT oGroup2; @s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 1 = "+ALLTRIM(STR(C(izN, 1))) PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(01) PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr02 PROMPT ' 2' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 2 = "+ALLTRIM(STR(C(izN, 2))) EDITPROTECT {||.NOT.mNCochPr02} HIDE {||.NOT.mNCochPr02} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(02) EDITPROTECT {||.NOT.mNCochPr02} HIDE {||.NOT.mNCochPr02} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr03 PROMPT ' 3' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 3 = "+ALLTRIM(STR(C(izN, 3))) EDITPROTECT {||.NOT.mNCochPr03} HIDE {||.NOT.mNCochPr03} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(03) EDITPROTECT {||.NOT.mNCochPr03} HIDE {||.NOT.mNCochPr03} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr04 PROMPT ' 4' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 4 = "+ALLTRIM(STR(C(izN, 4))) EDITPROTECT {||.NOT.mNCochPr04} HIDE {||.NOT.mNCochPr04} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(04) EDITPROTECT {||.NOT.mNCochPr04} HIDE {||.NOT.mNCochPr04} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr05 PROMPT ' 5' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 5 = "+ALLTRIM(STR(C(izN, 5))) EDITPROTECT {||.NOT.mNCochPr05} HIDE {||.NOT.mNCochPr05} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(05) EDITPROTECT {||.NOT.mNCochPr05} HIDE {||.NOT.mNCochPr05} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr06 PROMPT ' 6' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 6 = "+ALLTRIM(STR(C(izN, 6))) EDITPROTECT {||.NOT.mNCochPr06} HIDE {||.NOT.mNCochPr06} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(06) EDITPROTECT {||.NOT.mNCochPr06} HIDE {||.NOT.mNCochPr06} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr07 PROMPT ' 7' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 7 = "+ALLTRIM(STR(C(izN, 7))) EDITPROTECT {||.NOT.mNCochPr07} HIDE {||.NOT.mNCochPr07} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(07) EDITPROTECT {||.NOT.mNCochPr07} HIDE {||.NOT.mNCochPr07} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr08 PROMPT ' 8' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 8 = "+ALLTRIM(STR(C(izN, 8))) EDITPROTECT {||.NOT.mNCochPr08} HIDE {||.NOT.mNCochPr08} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(08) EDITPROTECT {||.NOT.mNCochPr08} HIDE {||.NOT.mNCochPr08} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr09 PROMPT ' 9' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 9 = "+ALLTRIM(STR(C(izN, 9))) EDITPROTECT {||.NOT.mNCochPr09} HIDE {||.NOT.mNCochPr09} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(09) EDITPROTECT {||.NOT.mNCochPr09} HIDE {||.NOT.mNCochPr09} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr10 PROMPT '10' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 10 = "+ALLTRIM(STR(C(izN,10))) EDITPROTECT {||.NOT.mNCochPr10} HIDE {||.NOT.mNCochPr10} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(10) EDITPROTECT {||.NOT.mNCochPr10} HIDE {||.NOT.mNCochPr10} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr11 PROMPT '11' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 11 = "+ALLTRIM(STR(C(izN,11))) EDITPROTECT {||.NOT.mNCochPr11} HIDE {||.NOT.mNCochPr11} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(11) EDITPROTECT {||.NOT.mNCochPr11} HIDE {||.NOT.mNCochPr11} PARENT oGroup2
@++s , 2 DCCHECKBOX mNCochPr12 PROMPT '12' PARENT oGroup2;@s+0.2, 10 DCSAY "Число сочетаний из "+ALLTRIM(STR(izN))+" признаков по 12 = "+ALLTRIM(STR(C(izN,12))) EDITPROTECT {||.NOT.mNCochPr12} HIDE {||.NOT.mNCochPr12} PARENT oGroup2
@s+0.2, 57 DCSAY "Всего = "+S(12) EDITPROTECT {||.NOT.mNCochPr12} HIDE {||.NOT.mNCochPr12} PARENT oGroup2
Function calculate the amount
Code: Select all
FUNCTION S(mNum)
mSumCnm = 0
IF mNCochPr02.AND.01<=mNum;Cnm = C(izN, 1);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr02.AND.02<=mNum;Cnm = C(izN, 2);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr03.AND.03<=mNum;Cnm = C(izN, 3);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr04.AND.04<=mNum;Cnm = C(izN, 4);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr05.AND.05<=mNum;Cnm = C(izN, 5);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr06.AND.06<=mNum;Cnm = C(izN, 6);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr07.AND.07<=mNum;Cnm = C(izN, 7);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr08.AND.08<=mNum;Cnm = C(izN, 8);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr09.AND.09<=mNum;Cnm = C(izN, 9);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr10.AND.10<=mNum;Cnm = C(izN,10);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr11.AND.11<=mNum;Cnm = C(izN,11);mSumCnm = mSumCnm + Cnm;ENDIF
IF mNCochPr12.AND.12<=mNum;Cnm = C(izN,12);mSumCnm = mSumCnm + Cnm;ENDIF
RETURN(ALLTRIM(STR(INT(mSumCnm))))
Function to calculate the number of combinations of large numbers without using the factorial
Code: Select all
***************************************************************
********* С(n,m) = n! / (m! (n - m)!) число сочетаний из n по m
***************************************************************
*FUNCTION C(n,m)
*RETURN(INT(F(n)/(F(m)*F(n-m))))
**************************************************************************
******** С(n,m) = n! / (m! (n - m)!) число сочетаний из n по m для больших
******** чисел без вычисления промежуточных факториалов путем разложения
******** факториалов на простые множители и их сокращений
******** С(n,m) = P(m+1,n) / P(1,n-m), где P(a,b) произведение целых чисел от a до b с шагом 1
**************************************************************************
******** 1. Найти все простые числа меньшие n
******** 2. Сформировать массив чисел числителя
******** 3. Сформировать массив простых сомножителей числителя
******** 4. Сформировать массив чисел знаменателя
******** 5. Сформировать массив простых сомножителей чисел знаменателя
******** 6. Сформировать массив простых сомножителей числителя,
******** не входящих в массив простых сомножителей знаменателя
******** 7. Перемножить массив уникальных простых сомножителей числителя
**************************************************************************
FUNCTION C(n,m)
***** 1. Найти все простые числа меньшие n
aPrCh := {} // Массив простых чисел
FOR j = 2 TO n
**** Проверка, является ли j простым числом
Flag = .T.
FOR i=2 TO j-1
IF j=i*INT(j/i) // Делится ли j на i
Flag = .F.
EXIT
ENDIF
NEXT
IF Flag
AADD(aPrCh, j)
ENDIF
NEXT
***** 2. Сформировать массив чисел числителя
aChis := {}
IF m < n
FOR j=m+1 TO n
AADD(aChis, j)
NEXT
ELSE
AADD(aChis, n)
ENDIF
******* 3. Сформировать массив простых сомножителей числителя
aPSChis := {}
FOR i=1 TO LEN(aChis)
***** Разложить число на простые множители
aPrMn := {} // Массив простых множителей числа: Chislo
Chislo = aChis[i]
Flag = .T.
DO WHILE Flag
FOR j=1 TO LEN(aPrCh)
**** Проверка, делится ли Chislo на простое число из массива aPrCh
Flag = .F.
IF Chislo = aPrCh[j] * INT(Chislo/aPrCh[j])
AADD(aPrMn,aPrCh[j])
Chislo = Chislo/aPrCh[j]
Flag = .T.
EXIT
ENDIF
NEXT
ENDDO
***** Занести простые множители числа aChis[j] в массив простых сомножителей числителя
FOR j=1 TO LEN(aPrMn)
AADD(aPSChis, aPrMn[j])
NEXT
NEXT
***** 4. Сформировать массив чисел знаменателя
aZnam := {}
IF n > m
FOR j=1 TO n-m
AADD(aZnam, j)
NEXT
ELSE
AADD(aZnam, 1)
ENDIF
******* 5. Сформировать массив простых сомножителей чисел знаменателя
aPSZnam := {}
FOR i=1 TO LEN(aZnam)
***** Разложить число на простые множители
aPrMn := {} // Массив простых множителей числа: Chislo
Chislo = aZnam[i]
Flag = .T.
DO WHILE Flag
FOR j=1 TO LEN(aPrCh)
**** Проверка, делится ли Chislo на простое число из массива Ar_prch
Flag = .F.
IF Chislo = aPrCh[j] * INT(Chislo/aPrCh[j])
AADD(aPrMn, aPrCh[j])
Chislo = Chislo/aPrCh[j]
Flag = .T.
EXIT
ENDIF
NEXT
ENDDO
*** Занести простые множители числа aZnam[j] в массив простых сомножителей знаменателя
FOR j=1 TO LEN(aPrMn)
AADD(aPSZnam, aPrMn[j])
NEXT
NEXT
******** 6. Сформировать массив простых сомножителей числителя,
******** не входящих в массив простых сомножителей знаменателя
aPS:= {}
FOR j=1 TO LEN(aPSChis)
Pos = ASCAN(aPSZnam, aPSChis[j])
IF Pos = 0
AADD(aPS, aPSChis[j])
ELSE
aPSZnam[Pos] = 1 // Сокращение простых сомножителей числителя и знаменателя
ENDIF
NEXT
******** 7. Перемножить массив уникальных простых сомножителей числителя и знаменателя
mMulChis = 1
FOR j=1 TO LEN(aPS)
mMulChis = mMulChis * aPS[j]
NEXT
mMulZnam = 1
FOR j=1 TO LEN(aPSZnam)
mMulZnam = mMulZnam * aPSZnam[j]
NEXT
RETURN(ROUND(mMulChis/mMulZnam,0))