Tag: 算法

多边形轮廓上的边缘并不总是正确的

我正在使用下面的算法来生成四边形,然后渲染这些四边形来制作这样的轮廓 http://img810.imageshack.us/img810/8530/uhohz.png 在图像上看到的问题是,当线条总是应该具有相同的宽度时,线条太细。 我的算法找到第一个的4个顶点,然后是下一个的前2个顶点是前一个的底部2 。 这会创建连接线,但似乎并不总是有效。 我怎么能解决这个问题? 这是我的算法: void OGLENGINEFUNCTIONS::GenerateLinePoly(const std::vector<std::vector> &input, std::vector &output, int width) { output.clear(); if(input.size() < 2) { return; } int temp; float dirlen; float perplen; POINTFLOAT start; POINTFLOAT end; POINTFLOAT dir; POINTFLOAT ndir; POINTFLOAT perp; POINTFLOAT nperp; POINTFLOAT perpoffset; POINTFLOAT diroffset; POINTFLOAT p0, p1, p2, p3; for(unsigned int i = […]

在给定时间内从f1到f2缓慢上升频率的正弦波

我正在编写交流程序,以产生一个正弦波,在给定的时间间隔内,从f1到f2的频率缓慢上升。 我已经编写了这个c程序来将频率从0增加到10 Hz,但问题是频率在完成360度后会发生变化。 如果我试图改变0到360度之间的频率,那么转换不平滑且突然。 这是我用过的罪的等式y =幅度* sin(频率*相位) int main(int argc, char *argv[]) { double y, freq,phase; int count; // for convenience of plotting in matlab so all the waves are spread on x axis. for (freq = 0; freq < 10; freq+=1) { for (phase = 0; phase < 360; phase++) { // phase is […]

变量大小的数组与C中的calloc

关于动态内存的讨论: “C指针和动态内存简介” 作者说: 像这样的存储块可以有效地用作更灵活的arrays。 在现实世界的C程序中,这种方法实际上更为常见。 它比“可变大小arrays”更具可预测性和灵活性 他正在讨论的内存块类型是这样的: const int size = 5; int * array = calloc(size, sizeof(int)); 然后使用另一个指针迭代数组: int * index = array; for (i = 0; i < size; i++) { *index = 1; // or whatever value index++; } 我的问题是这个方法比这样的标准变量大小的数组更好吗?: int array[variable]; 或动态的: char name[] = “Nick”; 作者并没有真正阐明为什么我更喜欢前一种方法而不是后一种方法。 或者更具体地说:它如何更“可预测和灵活”?

与最相似的字符串进行字符串比较

有没有人知道如果存在给定一个字符串A和字符串B数组的算法,则将A字符串与B中的所有字符串进行比较,使输出中的字符串最相似。 对于“最相似的”,我的意思是,例如, 如果A字符串是:“hello world你好吗” 然后 “asdf asdewr你好世界怎么asfrqr你” 比以下更相似: “h2ll4 w1111 h11 111 111”

这是计算nCr的更好方法

方法1: C(n,r)= n!/(nr)!r! 方法2: 在wilf的“ Combinatorial Algorithms ”一书中,我发现了这个: C(n,r)可写为C(n-1,r) + C(n-1,r-1) 。 例如 C(7,4) = C(6,4) + C(6,3) = C(5,4) + C(5,3) + C(5,3) + C(5,2) . . . . . . . . After solving = C(4,4) + C(4,1) + 3*C(3,3) + 3*C(3,1) + 6*C(2,1) + 6*C(2,2) 如您所见,最终解决方案不需要任何乘法。 在每种formsC(n,r)中,n == r或r == 1。 这是我实现的示例代码: […]

合并两个已排序的链接列表

这是Microsoft编写测试期间提出的编程问题之一。 我提出了我想出的问题和答案。 事情虽然看起来很全面(至少对我来说),但我觉得可以减少行数。 它在C中被问到我是一个Java人,但我设法编写它(我的答案可能包含太多类似Java的语法) 好的,这是问题所在。 您有两个已经排序的列表,您必须合并它们并返回一个没有任何新额外节点的新列表。 返回的列表也应该排序。 方法签名是, Node* MergeLists(Node* list1, Node* list2); struct Node{ int data; Node *next; } 以下是我提出的解决方案, Node* MergeLists(Node* list1, Node* list2){ Node* mergedList; if(list1 == null && list2 ==null){//if both are null, return null return null; } if(list1 == null){//if list1 is null, simply return list2 return list2; } if(list2 […]

C是否有任何添加字符串的工具?

我正在创建一个函数,它返回一个表示为树的函数的导数 / + \ * ^ / \ / \ x 5 3.14 x 与表单的节点 typedef struct node { char * fx; // function struct node * gx; // left-hand side char * op; // operator struct node * hx; // right-hand side } node; 如果节点没有子节点,例如上例中的x , 3.14 ,则其op , gx和hx为NULL ,否则其fx为NULL 。 我计算导数的函数看起来像 char […]

在C中生成INTEGERS的均匀分布

我编写了一个C函数,我认为从范围[rangeLow,rangeHigh](包括范围)的均匀分布中选择整数 。 这不是家庭作业 – 我只是在一些嵌入式系统中使用它来修补我正在做的事情。 在我的测试用例中,此代码似乎产生了适当的分布。 但是,我并不完全相信实施是正确的。 如果我在这里做错了什么,有人可以做一次健全检查并让我知道吗? //uniform_distribution returns an INTEGER in [rangeLow, rangeHigh], inclusive. int uniform_distribution(int rangeLow, int rangeHigh) { int myRand = (int)rand(); int range = rangeHigh – rangeLow + 1; //+1 makes it [rangeLow, rangeHigh], inclusive. int myRand_scaled = (myRand % range) + rangeLow; return myRand_scaled; } //note: make sure rand() […]

从两个相交的链表中查找相交节点

假设有两个单链表,它们在某个点相交并成为单个链表。 两个列表的头部或起始指针都是已知的,但交叉节点是未知的。 此外,列表中每个列表中的节点数量在它们相交之前是未知的,并且两个列表可能具有不同,即List1在到达交叉点之前可能有n个节点,而List2可能在到达交点之前有m个节点,其中m和n可能是 m = n, m <n或 m> n 一种已知或简单的解决方案是将第一列表中的每个节点指针与第二列表中的每个其他节点指针进行比较,匹配节点指针将通过该指针引导我们到交叉节点。 但是,在这种情况下,时间复杂度将是O(n 2 ),这将是很高的。 找到交叉节点的最有效方法是什么?

一种可能的算法,用于确定两个字符串是否是彼此的字谜?

我有这个想法(使用C语言)来检查由ASCII字母组成的两个字符串是否是彼此的字谜: 检查字符串是否长度相同。 检查两个字符串的所有字符的ASCII值之和是否相同。 检查两个字符串的所有字符的ASCII值的乘积是否相同。 我相信如果所有三个都是正确的,那么字符串必须是彼此的字谜。 但是,我无法certificate这一点。 有人可以帮我certificate或反驳这会起作用吗? 谢谢!