免责声明:这不是一个家庭作业问题。我什至不上学。
#include <stdio.h>
void printIntersect(float, float, float, float);
int main(){
int x, y, z, a;
float slopes[] = {5, 9, 4/3.0f, 2/3.0f, 3};
float inter[] = {3, 2, 1, 0, 5/3.0f};
for(x = 0; x < (sizeof(slopes) / sizeof(slopes[0])) - 1; x++)
for(y = 1; y < (sizeof(slopes) / sizeof(slopes[0])); y++)
for(z = 0; z < sizeof(inter) / sizeof(inter[0]); z++)
for(a = 0; a < sizeof(inter) / sizeof(inter[0]); a++)
if(slopes[x] != slopes[y])
printIntersect(slopes[x], slopes[y], inter[z], inter[a]);
return 0;
}
void printIntersect(float m_one, float m_two, float b_one, float b_two){
float m_final, b_final, x_intersect;
m_final = m_one - m_two;
b_final = b_two - b_one;
if(m_final < 0 && b_final < 0)
m_final *= -1.0f, b_final *= -1.0f;
if (b_final != 0)
x_intersect = b_final / m_final;
else
x_intersect = 0;
printf("The intersection of y = %.2fx %c %.2f and y = %.2fx %c %.2f is x = %.2f\n",
m_one, (b_one < 0) ? '-' : '+', b_one, m_two, (b_two < 0) ? '-' : '+', b_two, x_intersect);
return;
}
情景:在我的一本 C 书籍中有一个我不确定的练习。我得到的问题是我有两个数组:一个代表一条线的可能斜率,另一个代表所有可能的 y 截距。目标是使用两条线的所有可能的斜率和截距组合来找到它们的交点。我要忽略平行线和重复线(考虑到它们是否不能平行,无论如何都会隐含地忽略它们,那么它们就不可能是同一条线)。
假设这是前提(此时我真的不在乎,这只是一个练习),我编写的程序使用了 4 个嵌套的 for 循环。你可以明白为什么这让我担心,但话又说回来,也许他们中的 4 个是必要的。
因为我不能有平行线,所以我从第一条线的斜率开始迭代斜率,然后遍历数组中的所有其他斜率作为第二条线的斜率。正是这种方式,我得到了所有可能的斜坡组合。
截距是不同的,因为我可以有一行相同的截距,但它们仍然不同。因此,它们之间的迭代不需要考虑重复。话虽如此,我遍历截距数组的方式应该考虑这两行中的每一个可能对。
如果线不平行,我会调用一个函数来打印 x 截距。
我的问题是,是否可以避免或至少简化这种 O(n^4) 解决方案?你对处理这样的数组有什么技巧吗?