在c ++中发现适合公式的所有正整数对的最佳方法是什么。例如:
a^2 * b = 16;//a & b MUST be positive INT.
我怎样才能找到符合公式的a和b的所有组合?
编辑:为了更清晰,这只是一个例子。真的,我有一个^ 2 * b = c,其中c使用for循环递增,我需要找到符合此等式标准的每个正整数对(a,b)。
答案 0 :(得分:5)
问题是找到满足等式(a,b)
的所有正整数对a^2 * b = c
,其中c
也是正整数。
从等式中,c
可以被完美的正方形整除。首先,我们找到均匀划分c
的所有完美正方形。很简单,a=1, b=c
满足这一要求,因此我们知道c
的每个值都至少有一个解决方案。找到每个a
后,我们会将c
除以a^2
中的每一个,以产生相应的b
。
以上是用C ++实现的:
std::vector<std::pair<int, int> > solve(int c) {
std::vector<int> a;
for (int i = 1; i * i <= c; ++i)
if (c % (i*i) == 0) a.push_back(i);
std::vector<std::pair<int, int> > solutions;
solutions.reserve(a.size());
for (std::vector<int>::iterator it = a.begin(); it != a.end(); ++it) {
const int& a = *it;
solutions.push_back(std::pair<int, int>(a, c / (a*a)));
}
return solutions;
}
此处为live example,显示c = 7! = 5040
的解决方案。
答案 1 :(得分:3)
找出c的因子,然后找到使用三个值的子集,其中两个是相同的。
答案 2 :(得分:1)
通过检查,三个整数解决方案是:
a =±1,b = 16
a =±2,b = 4
a =±4,b = 1
否则,有无限的解决方案。 Wolfram | Alpha gives the details。
答案 3 :(得分:0)
如果您需要反复执行此操作,我认为这是解决此问题的最有效方法: 1.设置一个方形表,[0,1,4,9,16 ......],表的长度取决于你要处理的最大数量,无论如何,你需要O( sqrt(N))查找表的空间。 2.将数字除以因子,例如,16有5个因子(1,2,4,8,16)。 3.从查看查找表,您可以在查找表中找到1,4和16。所以有6对,命名,( - 1或1)^ 2 * 16,( - 2或2)^ 2 * 4,和( - 4或4)^ 2 * 1.