Tag: 算法

特定的模乘算法

我有3个大的64位数字:A,B和C.我想计算: (A x B) mod C 考虑到我的寄存器是64位,即写a * b实际上产生(A x B)mod2⁶⁴。 最好的方法是什么? 我在C编码,但在这种情况下不认为语言是相关的。 在获得指向此解决方案的评论之后: (a * b) % c == ((a % c) * (b % c)) % c 让我具体一点:这不是一个解决方案,因为((a%c)*(b%c))可能仍然大于2⁶⁴,寄存器仍会溢出并给我错误的答案。 我会: (((A mod C)x(B mod C))mod2⁶⁴)mod C.

取消设置最右边的设置位

可能重复: 如何在C中设置,清除和切换一个位? 删除最低位 n是正整数。 如何解除最右边的设置位? 假设n = 7 => n = 0111.我想要0110作为输出。 是否有任何简单的按位攻击来实现目标?

四叉树解释和C实现

请解释四叉树并提供简单的代码(最好用C语言)进行插入和搜索。

解析数学表达式

(在c90)(linux) 输入: sqrt(2 – sin(3*A/B)^2.5) + 0.5*(C*~(D) + 3.11 +B) a b /*there are values for a,b,c,d */ c d 输入: cos(2 – asin(3*A/B)^2.5) +cos(0.5*(C*~(D)) + 3.11 +B) a b /*there are values for a,b,c,d */ c d 输入: sqrt(2 – sin(3*A/B)^2.5)/(0.5*(C*~(D)) + sin(3.11) +ln(B)) /*max lenght of formula is 250 characters*/ a b /*there […]

低内存条件下的LZW压缩/解压缩

任何人都可以指出如何在低内存条件下(<2k)实现lzw压缩/解压缩。 那可能吗?

如何生成与直方图匹配的点?

我正在研究一个模拟系统。 我将很快获得实验数据(直方图),用于几个模拟输入的实际值分布。 当模拟运行时,我希望能够生成与测量分布匹配的随机值。 我宁愿这样做而不存储原始直方图。 什么是好方法 将直方图映射到表示分布的一组参数? 在运行时生成基于这些参数的值? 编辑:输入数据是几种不同类型事件的事件持续时间。 我希望不同的类型具有不同的分布函数。

如何检查点(x,y)是否在笛卡尔坐标系中的多边形内?

这个问题在这里已有答案: 指向Polygon aka命中测试 C#指向多边形 给定在笛卡尔坐标系中用N线方程组成的随机多边形,是否有任何标准公式用于检查点(x,y)的隶属度? 简单的解决方案是获取所有线公式,并检查点X是否在该线下方,在该线上方以及在另一条线的右侧,等等。但这可能是单调乏味的。 我应该注意,多边形可以是任何形状,具有任意数量的边,并且可以是凹的或凸的。 为方便起见,我已经添加了这些实用function: float slope(CGPoint p1, CGPoint p2) { return (p2.y – p1.y) / (p2.x – p1.x); } CGPoint pointOnLineWithY(CGPoint p, float m, float y) { float x = (y – py)/m + px; return CGPointMake(x,y); } CGPoint pointOnLineWithX(CGPoint p, float m, float x) { float y = m*(x – […]

计算多个数字的几何平均值的有效方法

我需要计算一大组数字的几何平均值,其值不是先验有限的。 天真的方式是 double geometric_mean(std::vector const&data) // failure { auto product = 1.0; for(auto x:data) product *= x; return std::pow(product,1.0/data.size()); } 但是,由于累积product的下溢或溢出,这可能会失败(注意: long double并不能真正避免这个问题)。 那么,下一个选项是总结对数: double geometric_mean(std::vector const&data) { auto sumlog = 0.0; for(auto x:data) sum_log += std::log(x); return std::exp(sum_log/data.size()); } 这可行,但为每个元素调用std::log() ,这可能很慢。 我可以避免吗? 例如,通过分别跟踪累积product的指数和尾数(相当于)?

反转链表的每个k个节点

我正在准备进行技术面试,我坚持编写这个程序来反转链表的每个k节点。 例如 1->2->3->4->5->6 //Linked List 2->1->4->3->6->5 //Output for k=2 编辑: 这是我的代码。 我得到的输出只有6-> 5。 struct node* recrev(struct node* noode,int c) { struct node* root=noode,*temp,*final,*prev=NULL; int count=0; while(root!=NULL && countlink; root->link=prev; prev=root; root=temp; } if(temp!=NULL) noode->link=recrev(temp,c); else return prev; } 任何帮助表示赞赏。 谢谢。 编辑:我试图实现Eran Zimmerman的算法如下。 struct node* rev(struct node* root,int c) { struct node* first=root,*prev,*remaining=NULL; int count=0; while(first!=NULL […]

3点之间的角度?

给定点ABC,我怎么能找到角度ABC? 我正在为矢量绘图应用程序制作一个手工工具,并尽量减少它生成的点数,除非鼠标位置和最后2个点的角度大于某个阈值,否则我不会添加点。 谢谢 我有什么: int CGlEngineFunctions::GetAngleABC( POINTFLOAT a, POINTFLOAT b, POINTFLOAT c ) { POINTFLOAT ab; POINTFLOAT ac; ab.x = bx – ax; ab.y = by – ay; ac.x = bx – cx; ac.y = by – cy; float dotabac = (ab.x * ab.y + ac.x * ac.y); float lenab = sqrt(ab.x * ab.x + […]