随笔分类 -  C++

C++
摘要:准确的讲是mingw所用的sdk —— w32api,存在结构定义错误。打开wingdi.h 定位到 tagGCP_RESULTSW 的结构定义位置, typedef struct tagGCP_RESULTSW { DWORD lStructSize; LPWSTR lpOutString; UINT *lpOrder; int *lpDx; int *lpCaretPos; LPWSTR lpClass; //正确的类型应该是 LPSTR LPWSTR lpGlyphs; UINT nGlyphs; int nMaxFit; } GCP_RESULTSW,*LPGCP_RESULTSW;. 阅读全文
posted @ 2013-03-21 21:50 flyinghearts 阅读(783) 评论(0) 推荐(1)
摘要:问题:判断点P是否在三角形ABC内 判断一个点是否在在三角形内,最常用的两种方法:面积法、向量同向法。算法虽然很简单,但要做到高效却不容易,要考虑到二维、三维的区别,还要考虑到坐标是用浮点数还是用整数来表示。 在二维平面上,问题相对简单,一般只需6次乘法计算。但在三维平面时问题要复杂很多,在网上看到的算法,一般都需要30次乘法计算(如果已知点P在平面ABC上,则需21次)。实际上,在三维坐标系下,可以做到增加1次比较,将乘法计算降到13次(如果点P在平面ABC上,则最多只要8次乘法计算)。 最常用的两种方法:面积法和向量同向法本质上是等价的。 向量同向法:若点P在三角形内,则三个向量:ab & 阅读全文
posted @ 2011-07-07 23:13 flyinghearts 阅读(10922) 评论(10) 推荐(0)
摘要:看了几天asio文档,总算可以写点小程序了。有些细节还是没弄明白,同步IO好像还不能设超时?服务器端采用异步IO,客户端则采用同步IO。传送文件,不得不注意到 C/C++ 2G文件限制,好像没通用的解决方法。先定义下头文件,统一下asio和boost_asio。 #ifndef_FILE_INFO_H_#define_FILE_INFO_H_#ifUSE_ASIO_ALONE#include<asio.hpp>#else#include<boost/asio.hpp>namespaceasio{usingnamespaceboost::asio;usingboost:: 阅读全文
posted @ 2011-07-07 22:57 flyinghearts 阅读(1584) 评论(0) 推荐(0)
摘要:要将一个数组的所有元素向左旋转k位,通常有三种算法:算法1(分组交换):若a长度大于b,将ab分成a0a1b,交换a0和b,得ba1a0,只需再交换a1 和a0。若a长度小于b,将ab分成ab0b1,交换a和b0,得b0ab1,只需再交换a 和b1。不断将数组划分和交换,直到不能再划分为止。分组过程与求最大公约数很相似。读写内存各 n到2*n次算法2 (三次反转)利用ba=(br)r(ar)r=(arbr)r,先分别反转a、b,最后再对所有元素进行一次反转。读写内存各约2*n次算法3 (使用循环链)假设 n、k的最大公约数为M,则所有序号为 (i + j*k) % n (0<= i &l 阅读全文
posted @ 2011-05-27 21:00 flyinghearts 阅读(6503) 评论(5) 推荐(1)
摘要:假设有某种很低级的芯片,不提供乘除法指令。问题1 计算从1加到N的和 (即 1 + 2 + 3 + ... + n)。问题2 求3的余数。对问题1,直接从1加到N,效率太差了,肯定不能这么干(小高斯都知道用乘法) 。既然不能用乘除法,那只好用加法来模拟了。 m * n,可以看做是 n个m相加,可以看做是 m,2*m, 4*m, 8*m, 16*m,... 中的几个相加。对问题2 设 n = 4 * a + b,则 n ≡ a + b (mod 3)unsignedsum(unsignedn){unsignedmin_v,max_v,ret=0;if(n&1){max_v=n;min_v 阅读全文
posted @ 2011-05-08 21:42 flyinghearts 阅读(343) 评论(0) 推荐(0)
摘要:SingleList*Reverse_SingleList(SingleList*head){SingleList*prev=NULL;while(head!=NULL){SingleList*next=head->next;head->next=prev;prev=head;head=next;}returnprev;} 阅读全文
posted @ 2011-05-08 19:53 flyinghearts 阅读(299) 评论(0) 推荐(0)
摘要:思路很简单:如果数组头尾,不是一负一正,则可以直接判断。如果是一负一正: 直接二分搜索最小正数。再与前面的那个数比较绝对值。求递增数组中绝对值最小的数#include<cstdio>#include<cassert>//从递增数组(允许重复)中找出绝对值最小的数intbsearch(constintarr[],size_tlen){assert(len>0);constsize_tend=len-1;if(arr[0]>=0)returnarr[0];if(arr[end]<=0)returnarr[end];size_tlow=0,high=end; 阅读全文
posted @ 2011-04-13 23:53 flyinghearts 阅读(503) 评论(0) 推荐(0)
摘要:从字符串中提取数字并排序输出看到别人的讨论贴,也做了下。题目很简单,可以直接用标准库函数,也可以自已造轮子。标准库中能用到的只有:atoi / strtol系列,显然得用 strtol(有些库atoi就是用strtol实现的)在用strtol前,先要对不安全的strtol封装下。int str2i(const char str[], const char* &next, int base = 10){ return strtol(str, const_cast<char**>(&next), base);}可采用两种算法: 1 先忽略空白字符,然后直接调用str2i 阅读全文
posted @ 2011-03-31 23:23 flyinghearts 阅读(1932) 评论(0) 推荐(0)