C++ 基于最大公分的排序序列
我有个问题。我写下这个比较器:C++ 基于最大公分的排序序列,c++,algorithm,C++,Algorithm,我有个问题。我写下这个比较器: bool cmp(int a, int b) { return __gcd(a, b) > 1; } 例如: 1 2 3 4 5 6 7 8 9 如果我有这些数字: 2 5 6 7 8 12 15 19 20 我的代码输出: 20 15 12 8 6 2 5 7 19 没关系 但例如: 1 2 3 4 5 6 7 8 9 我的代码输出 1 2 3 4 5 6 7 8 9 我该怎么做 这个序列应该是这样的: 9 6 3 (...) 您的比较
bool cmp(int a, int b)
{
return __gcd(a, b) > 1;
}
例如:
1 2 3 4 5 6 7 8 9
如果我有这些数字:
2 5 6 7 8 12 15 19 20
我的代码输出:
20 15 12 8 6 2 5 7 19
没关系
但例如:
1 2 3 4 5 6 7 8 9
我的代码输出
1 2 3 4 5 6 7 8 9
我该怎么做
这个序列应该是这样的:
9 6 3 (...)
您的比较器未建立,因此结果未定义 要使用正确的比较器,您必须确保以下内容正确:
cmp(a,a)=false
-您的比较器未通过cmp(2,2)
cmp(a,b)=true→ cmp(b,a)=false
-您的比较器未通过cmp(2,4)
cmp(a,b)==true和cmp(b,c)==true→ cmp(a,c)=true
-您的比较器未通过对cmp(2,6)和cmp(6,3)的测试
您的比较器未建立,因此结果未定义
要使用正确的比较器,您必须确保以下内容正确:
cmp(a,a)=false
-您的比较器未通过cmp(2,2)
cmp(a,b)=true→ cmp(b,a)=false
-您的比较器未通过cmp(2,4)
cmp(a,b)==true和cmp(b,c)==true→ cmp(a,c)=true
-您的比较器未通过cmp(2,6)和cmp(6,3)
您可能正在使用std::sort
?这不行<代码>标准::排序需要,这基本上意味着它必须像普通数字一样排序。例如,3老实说,我不知道你想达到什么样的目的。我看不出一个元素比另一个元素“大”是有意义的,如果它们有非平凡的gcd,当两者都比对方“大”时。这不是一个编程错误,这是一个数学错误。想想你真正想要什么。它真的有意义吗?大概您使用的是std::sort
?这不行<代码>标准::排序
需要,这基本上意味着它必须像普通数字一样排序。例如,3老实说,我不知道你想达到什么样的目的。我看不出一个元素比另一个元素“大”是有意义的,如果它们有非平凡的gcd,当两者都比对方“大”时。这不是一个编程错误,这是一个数学错误。想想你真正想要什么。这真的有意义吗?@JanKo你需要再考虑一下你的排序标准。为什么排序序列应该以9,6,3
开头?为什么不8,4,2
?为什么不使用3,6,9
、6,3,9
或其他3种组合?排序后数字2,4
应按什么顺序排列?为什么?你会发现,有一个公约数不足以建立明确的顺序,你将被迫给出额外的标准。真理是无关紧要的。创建一个序列,重要的是建立在gcd@JanKo听起来像。也许你不需要排序,但需要一些聚类算法来代替?我不知道为什么没有排序我怎么能做到这一点。@JanKo你需要再次考虑你的排序标准。为什么排序序列应该以9,6,3
开头?为什么不8,4,2
?为什么不使用3,6,9
、6,3,9
或其他3种组合?排序后数字2,4
应按什么顺序排列?为什么?你会发现,有一个公约数不足以建立明确的顺序,你将被迫给出额外的标准。真理是无关紧要的。创建一个序列,重要的是建立在gcd@JanKo听起来像。也许你不需要排序,但需要一些聚类算法来代替?我不知道为什么没有排序我可以做到这一点。。