我正在尝试创建一个算法,该算法将列出大小为s(SoD)的n组(NoD)的笛卡尔积。这似乎几乎适用于所有情况,遵循预期的向上计数模式(如果你打印3组4的笛卡尔积,你可以观察到这一点)。但是,下面列出了两个主要问题:
(1)对于某些值,幂函数似乎给了我一些答案。如果我想要2套14我得到196(这是正确的,因为14 ^ 2 = 196),但是如果我想要2套20计算机告诉我399(它应该是400)。这是因为我对整数进行了双击(数学标题只占用并产生双打)或者奇怪的东西吗?
(2)是否有计算机愿意打印多少行的截止?如果输入变得足够大,虽然算法的组合方法似乎有效,但它打印的第一行不是[0 0 0 0],而是像[3 2 1 4]。我可以从字面上看到它在所有可能的集合中滴答作响然后它不会让我一直向后滚动并阅读它们。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void counter(int* NoD, int* SoD, int* ticker, int* indexer, int* numPoss)
{
for (int i = 0; i < *numPoss; i++)
{
printf("\n");
for (int k = 0; k < *NoD; k++)
{
printf("%i\t", *(ticker+k));
}
if (*(ticker +*indexer) == (*SoD-1))
{
if (*(ticker + *indexer -1) < *SoD-1)
{
*(ticker + *indexer -1) = *(ticker + *indexer -1)+1;
*indexer = *NoD-1;
*(ticker +*indexer) = 0;
}
else
{
while (*(ticker +*indexer) >= *SoD-1)
{
*indexer = *indexer - 1;
}
*(ticker + *indexer) = *(ticker + *indexer)+1;
for (int i = *indexer+1; i < *NoD; i++)
{
*indexer = *indexer +1;
*(ticker +*indexer) = 0;
}
}
}
else
{
*(ticker +*indexer) = *(ticker +*indexer)+1;
}
}
}
void main()
{
int NoD, SoD;
puts("enter number of sets\n");
scanf("%i", &NoD);
puts("enter size of sets\n");
scanf("%i", &SoD);
int* ticker = (int*)malloc(NoD*sizeof(int));
for (int i = 0; i < NoD; i++)
{
*(ticker + i) = 0;
}
int indexer = NoD-1;
int numPoss = (int)pow((double)SoD,(double)NoD);
counter(&NoD, &SoD, ticker, &indexer, &numPoss);
printf("the number of cartesian products is %i\n", numPoss);
}