C++ 用C+查找4个向量的所有可能组合+;

C++ 用C+查找4个向量的所有可能组合+;,c++,combinations,C++,Combinations,我想根据用户输入找到四个基向量(维=4)的所有可能组合。应该允许重复 也就是说,我们把向量a、b、c和d称为向量 如果用户输入N=3,则组合可以是: aaa aab aac . . . ddd 我尽力了,但我对C++还不熟悉。 应用程序还应计算基向量的乘法(即a*a*a)并存储结果 我以前肯定在论坛上看过,但是发现了关于组合整数或向量元素的文章 谢谢你的帮助。穿上两个4乘4的for循环。 这将贯穿每一个可能的组合 vector<char> temp; temp.push_back

我想根据用户输入找到四个基向量(维=4)的所有可能组合。应该允许重复

也就是说,我们把向量a、b、c和d称为向量

如果用户输入N=3,则组合可以是:

aaa aab aac . . . ddd

我尽力了,但我对C++还不熟悉。 应用程序还应计算基向量的乘法(即a*a*a)并存储结果

我以前肯定在论坛上看过,但是发现了关于组合整数或向量元素的文章


谢谢你的帮助。

穿上两个4乘4的for循环。 这将贯穿每一个可能的组合

vector<char> temp;


temp.push_back('a');
temp.push_back('b');
temp.push_back('c');
temp.push_back('d');



for(int i = 0; i < 4; i++)
{
    for(int k = 0; k < 4; k++)
        cout << temp[i] << temp[k] << endl;
}
矢量温度;
温度推回(“a”);
温度后推('b');
温度推回(“c”);
温度推回(“d”);
对于(int i=0;i<4;i++)
{
对于(int k=0;k<4;k++)

cout如果您的程序是基于linux的(例如,您可以访问bash类型的shell),那么您可以通过键入命令:“echo{a,b,c,d}{a,b,c,d}{a,b,c,d}{a,b,c,d}”,来获得所有的组合,例如a,b,c,d},N=3,这将打印出上面的所有组合:aaa,aab…等等

然后你可以捕捉输出并逐字解析,然后将一个基向量(比如dim=4的(1,1,1,1))乘以对应于该字母的每个向量。但是,你说的向量相乘是什么意思?你的意思是找到a*a*a的大小?因为你不能相乘(1x4)向量在一起-你只能取它们的点积(因此对a*a*a的唯一可能解释似乎是| a |^3)

调用echo命令的示例:

#include <stdio.h>
#include <string>
#include <vector>

int n; //user given - n>1
Vector4D* vectors[n]; // Or some other name for the class
// Have the user input the vectors
std::string base = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
std::string list = "{"+base.substr(0,2*n+1)+"}";
std::string query = "echo ";
for(int i = 0; i<4; i++){
    query += list;
}
File *file;
file=popen(query.c_string(), "r");
char combo[4];
std::vector<Vector4D> results;
while(fscanf(file,"%s", combo)){
    Vector4D result(1,1,1,1); //our default (identity) vector
    for(int i = 0; i<4; i++){
        result = Vector4D.multiply(result, Vectors[combo[i]-'a']);
    }
    results.push_back(result);
} 
fclose(file);
#包括
#包括
#包括
int n;//用户给定-n>1
Vector4D*vectors[n];//或类的其他名称
//让用户输入向量
std::string base=“a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z”;
std::string list=“{”+base.substr(0,2*n+1)+“}”;
std::string query=“echo”;

对于(inti=0;i我将研究如何使用多维数组(在本例中为二维数组)

现在,我的编程水平也不是很好,所以我的程序有点笨重,但希望你能了解我在下面的伪代码示例中所说的内容

根据用户输入的数字计算嵌套数:

user enters 4

array{ar1{a,b,c,d},ar2{a,b,c,d},ar3{a,b,c,d}ar4{a,b,c,d}}
create counter var for each array (c1, c2, c3, c4)

loop increment counters c1-4 for each letter (a-b)
print value from array table.
我知道它很邋遢,但这是我能想到的最好的方法(近3年没有编程了!哈哈),但一定要看看多维数组:


祝你好运!

因为这是家庭作业,我不会给你写一个完整的解决方案。请检查此伪代码:

all(&srcvectors, depth, temp, &resultvectors)
    if (depth == 0)
        resultvectors.push(temp);
    else
        for (int i=0; i < 4; i++)
            all(srcvectors, depth-1, crossproduct(temp, srcvectors[i]), resultvectors);
all(&src向量、深度、温度和结果向量)
如果(深度==0)
结果:射角推(温度);
其他的
对于(int i=0;i<4;i++)
全部(srcvectors,深度-1,叉积(temp,srcvectors[i]),结果向量);
您必须从外部for循环调用此函数,将每个srcvector作为temp传递。您还必须确定必须传递的初始深度(尝试对此进行推理,不要使用反复试验)


希望这能有所帮助。

让我们看看你现有的代码。让我们知道你在哪里得到了StuckCodeing而不需要用户输入很容易,就像我想要的一样多的for循环。但是如果我不知道,需要提前多少for循环,我不知道从哪里开始。这是家庭作业,对吗?@Kepler:递归敲钟了吗?我必须这样做是为了我的学习。我知道什么是递归,但我自己还不能找到递归。迭代是关键:-)但是如果你有一个递归的方法,没关系。叉积有意义吗?我从来没有听说过有人把叉积称为乘法。我不明白为什么有人会这样做。而且,在这个例子中,叉a会产生0,所以这似乎有点不必要。叉0甚至没有意义。数字上它也是零,但从视觉上看,它没有意义“这似乎没有什么意义。@斯特洛克:因为乘积是乘法的同义词……我真正要做的是计算张量积,但当我有了这些组合时,这应该是没有意义的。”problem@strelok:共线向量的叉积是有意义的。举一个物理学的例子,你计算一个物体中移动电荷所受的力磁场。如果向量对齐,则没有力。还要注意,aaa..只是所有组合中的一个。主持人注意,由于对话退化为远大于信号的噪音,因此此帖子下的评论已被删除。请保持评论礼貌、建设性和主题性。你的意思是:“为每个字母(a-b)循环递增计数器c1-4?”@Kepler-为每个数组(aka,c1-C4)创建一个计数器,并使用每个计数器步进数组的每个子组。(使用计数器递增/重置a到D)。查看我提供的链接以获取有关该主题的更多信息。
all(&srcvectors, depth, temp, &resultvectors)
    if (depth == 0)
        resultvectors.push(temp);
    else
        for (int i=0; i < 4; i++)
            all(srcvectors, depth-1, crossproduct(temp, srcvectors[i]), resultvectors);