判断质数的小算法

质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为包含1和本身的因子等于2个)。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的地位。(From wikipedia) 下面提供判断一个整数是否是质数的简单C实现: #include <stdio.h> #include <stdlib.h> #include <math.h> int Prime(int num) { num = abs(num); if ((num==0)&&(num==1)) return 0; /*int k = num/2;*/ int k =(int)sqrt(num); while((k>1)&&(num%k)) { --k; } return 1==k; } int main() { int num; printf("Please input an integer (Ctrl-Z to exit) : "); while(scanf("%d",&num)) { if (Prime(num)){ printf("\n%d is a Prime.\n",num); } else printf("\n%d is not a Prime.\n",num); printf("\nPlease input an integer (Ctrl-Z to exit) : "); } } 算法逻辑: Prime函数用来判断某个整数num是否是质数,是则返回非零整数,否则返回零。 Prime函数内部,首先定义一个num的中间数k,可以是num的一半,可以是num的平方根,当然也可以是原数,这里选取平方根,因为这样做效率更高。然后拿这个数k 与 num相除,同时k递减。如果num是质数,那么k在递减的过程中都不会整除num,直到k==1 ; 而如果num不是质数,那么就会找到num的一个非1的因数。

2015年3月22日 · 1 分钟 · Jid

修改Thunderbird回复格式

Thunderbird回复邮件的格式很不好看,而且还是把回复的内容都放在原文引用的下面,用的很不舒服。 下面是对这个使用问题的解决办法: (1)回复内容放在最前边 英文界面:Edit->Perferences->Advanced->Config Editor->I’ll be careful,I promise->mail.identity.default.reply_on_top 会发现目前的默认值为0,改为1即可。 中文界面:工具->选项->高级->常规->配置编辑器->我保证会小心->mail.identity.default.reply_on_top 将默认值由0为1 (2)安装附加插件: SmartTemplate的强大之处就是可以直接用html控制邮件的格式, 安装完之后在附加组件里找到它,点“选项”,编辑配置,如下图 首先点选图中所示的几个选项,然后复制如下代码 -------- <FONT face=Verdana size=3>原始信息</FONT> -------- <FONT face=Verdana size=2><b>发件人</b></FONT>: %from% <FONT face=Verdana size=2><b>日期</b></FONT>: %date% <FONT face=Verdana size=2><b>收件人</b></FONT>: %to% <FONT face=Verdana size=2><b>抄送人</b></FONT>: %cc% <FONT face=Verdana size=2><b>主题</b></FONT>: %subject% 到上图所示的空白处,然后确定即可(完全可以依个人口味进行配置)。 其中,%**%之类的东西是SmartTemplate定义的几个宏,完整宏列表在链接 可以找到,或者见下: 附录: Reserved words - Common : %ownname% Own account name %ownmail% Own mail address %Y% Year (1970...) %m% / %n% Month (01..12 / 1..12) %d% / %e% Day of month (01..31 / 1..31) %H% / %k% Hour (00..23 / 0..23) %I% / %l% Hour (01..12 / 1..12) %M% Minute (00..59) %S% Second (00..59) %p% / %p(x)% AM or PM, x=1(a.m.)/x=2(A.M.)/x=3(AM) %A% / %a% Locale's weekday name (Sunday..Saturday / Sun..Sat) %B% / %b% Locale's month name (January..December / Jan..Dec) Reserved words - Reply/Forward message %from% Author %from(name)% Author name %from(firstname)% Author firstname %from(mail)% Author mail address %date% Date string (same as mail header syntax) %datelocal% Date string (locale format) %dateshort% Date string (such as 2000/01/01 1:23:45) %date_tz% Time zone (e.g., +0100) %to% Recipients(to) %to(name)% Recipients name(to) (mail address, if name is not available.) %to(mail)% Recipients mail address(to) %cc% Recipients(cc) %cc(name)% Recipients name(cc) (mail address, if name is not available.) %cc(mail)% Recipients mail address(cc) %subject% Subject %........% An any e-mail header(e.g., %Message-Id%, %Newsgroups%, %X-Mailer%, ...) Reserved words - Additional syntax {...%reserved word%...} Phrase enclosed in "{" and "}" is displayed if reserved word has been replaced. Phrase consists of a reserved word and another words. For example, To: %toname%{ Cc: %ccname%} will be replaced as follows, when ccname is not effective, and To: foo will be replaced as follows, when ccname is effective. To: foo Cc: boo %X:=sent% %A-Za-z% is converted to the time the original message was sent. %X:=today% %A-Za-z% is converted to today. Notes about the template with HTML format Use HTML Escape Characters " , & , < , > are need to escape by &quot; , &amp; , &lt; , &gt;. And, you can also use other escape characters. New-line You need to use <br> for new-line, when 'Replace new-line with <br>' does not used.

2015年3月21日 · 2 分钟 · Jid

用C语言实现简单循环队列结构

用C实现简单循环队列结构 /* * 用C实现简单循环队列结构 * * 循环队列的类型定义如下: * typedef struct{ * valuetype data[MAXSIZE]; [>数据的存储区<] * int font, rear; [>队首队尾<] * int num; [>队列中元素的个数<] * }Circular_Queue; * 循环队列常用函数如下: * (1)Circular_Queue * Init_CirQueue(): 初始化队列 * (2)int In_CirQueue(Circular_Queue *q, valuetype x): 将元素x插入队列q的队尾,若成功返回1,否则返回0 * (3)int Out_CirQueue(Circular_Queue *q, valuetype *x): 取出队列q队首位置的元素,若成功返回1,否则返回0 */ /*程序代码:*/ #include <stdio.h> #include <malloc.h> #define MAXSIZE 100 typedef int valuetype; typedef struct{ valuetype data[MAXSIZE]; /*数据的存储区*/ int font, rear; /*队首队尾*/ int num; /*队列中元素的个数*/ }Circular_Queue; Circular_Queue * Init_CirQueue() { Circular_Queue *q = (Circular_Queue*)malloc(sizeof(Circular_Queue)); q->font = q->rear = MAXSIZE-1; q->num = 0; return q; } int In_CirQueue(Circular_Queue *q, valuetype x) { if(q->num == MAXSIZE) return 0; /*队满,不能入队*/ else { /*q->rear = (q->rear+1)%MAXSIZE;*/ q->data[q->rear] = x; q->rear = (q->rear+1)%MAXSIZE; q->num++; return 1; } } int Out_CirQueue(Circular_Queue *q, valuetype *x) { if(q->num == 0) return 0; /*队空*/ else{ *x = q->data[q->font]; q->font = (q->font+1)%MAXSIZE; q->num--; return 1; } } int main() { Circular_Queue *queue = Init_CirQueue(); int x=0; for(int i=0;i<10;++i) { if(!In_CirQueue(queue, i)) break; } while(Out_CirQueue(queue, &x)) printf("%d ",x); printf("\n"); return 0; }

2015年3月21日 · 1 分钟 · Jid

八皇后问题递归回溯算法实现

八皇后问题递归回溯算法实现 /* * 八皇后问题递归回溯算法实现 * * 八皇后问题或N皇后问题描述为: * 求解如何在N*N的棋盘上无冲突地排放N个皇后棋子。其中,皇后的移动方式规定为水平、竖直及45°斜线方向。因此,在任意一个皇后所在位置的水平、竖直和45°方向上都不能出现其他的皇后棋子。 * * 回溯法的基本思想是:在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一个结点时,要先判断该结点是否包含问题的解,如果包含,就从该节点出发继续探索下去;如果该结点不包含问题的解,那就说明以该结点为根结点的子树一定不包含问题的最终解,因此要跳过对以该节点为根的子树的系统探索,逐层向其祖先结点回溯。这个过程又叫做解空间树的剪枝操作。 * * 八皇后问题可以有很多解法,其中之一是回溯法。 * 用回溯法求解八皇后问题,可以按列试探可能的解,一旦该列找不到任何可能的解那么就要向后回溯。 */ /*程序代码如下:*/ #include <stdio.h> #define NUM 8 /*棋盘用NUM*NUM的矩阵Q描述,其中,里面的元素如果是1表示可以放置皇后,如果为0表示不能放置皇后,另外,(i,j)表示矩阵的第(i,j)个元素*/ /*判断能否在(i,j)位置放置皇后*/ int isOK(int i, int j, int (*Q)[NUM]) { int s=0, t=0; for(s=i,t=0;t<NUM;++t) /*判断行*/ if(t!=j && Q[s][t]==1) return 0; for(s=0,t=j;s<NUM;++s) /*判断列*/ if(s!=i && Q[s][t]==1) return 0; for(s=i-1,t=j-1;s>=0&&t>=0;--s,--t) /*判断左上方*/ if(Q[s][t]==1) return 0; for(s=i+1,t=j-1;s<NUM&&t>=0;++s,--t) /*判断左下方*/ if(Q[s][t]==1) return 0; /* Thank @ewitt*/ /* 下面的东西没用 */ /* for(s=i-1,t=j+1;s>=0&&t<NUM;--s,++t) //判断右上方 * if(Q[s][t]==1) * return 0; * for(s=i+1,t=j+1;s<NUM&&t<NUM;++s,++t) //判断右下方 * if(Q[s][t]==1) * return 0; */ return 1; } void Queen(int j, int (*Q)[NUM]) { if(j==NUM) /*找到一个解*/ { for(int i=0;i<NUM;++i) { for(int k=0;k<NUM;++k) printf("%d ",Q[i][k]); printf("\n"); } printf("\n"); return; } else{ for(int i=0;i<NUM;++i) { if(isOK(i,j,Q)) /*如果可以*/ { Q[i][j]=1; Queen(j+1,Q); /*深度优先探索解空间树*/ Q[i][j]=0; } } } } /*test program*/ int main() { int Q[NUM][NUM]; int i=0, j=0; for(i=0;i<NUM;++i) for(j=0;j<NUM;++j) Q[i][j] = 0; /*初始化*/ Queen(0,Q); return 0; }

2015年3月20日 · 1 分钟 · Jid

用C语言实现简单链式队列结构

##用C语言实现简单链式队列结构 /* * 用链式结构实现的队列称为链队。根据队列的FIFO原则,为了操作上的方便,可以用带头指针font和尾指针rear的单链表来实现队列。链队结构描述: * typedef struct node * { * valuetype data; * struct node *next; * }QNode; [>链队结点的类型<] * typedef struct * { * QNode *font, *rear; * }LQueue; [>将头尾指针封装在一起的链队<] * * 设q是一个指向链队的指针,即LQueue *q. 各函数的功能如下: * (1)LQueue * Init_LQueue(): 创建并返回一个带头尾结点的空链队 * (2)int Empty_LQueue(LQueue *q): 判断链队是否为空 * (3)void In_LQueue(LQueue *q, valuetype x) : 将数据x压入链队q * (4)int Out_LQueue(LQueue *q, valuetype *x) : 弹出链队q的第一个元素x, 若成功则返回1否则返回0 * By Guv 2011.06.10 */ /*程序代码:*/ #include <stdio.h> #include <malloc.h> typedef int valuetype; typedef struct node { valuetype data; struct node *next; }QNode; typedef struct { QNode *font, *rear; }LQueue; LQueue * Init_LQueue() { LQueue *q; QNode *p; q = (LQueue*)malloc(sizeof(LQueue)); /*申请链队指针*/ p = (QNode*)malloc(sizeof(QNode)); /*申请头尾指针结点*/ p->next = NULL; q->font = q->rear = p; return q; } int Empty_LQueue(LQueue *q) { if(q->font != q->rear) return 0; else return 1; } void In_LQueue(LQueue *q, valuetype x) { QNode *p = (QNode *)malloc(sizeof(QNode)); /*申请新结点*/ p->data = x; p->next = NULL; q->rear->next = p; q->rear = p; } int Out_LQueue(LQueue *q, valuetype *x) { if(Empty_LQueue(q)) return 0; /*空链队*/ else{ QNode *p = q->font->next; *x = p->data; q->font->next = p->next; free(p); if (q->font->next == NULL) q->rear = q->font; return 1; } } int main() { LQueue *queue = Init_LQueue(); for (int i=0;i<10;++i) { In_LQueue(queue, i); } while(!Empty_LQueue(queue)) { int k=0; Out_LQueue(queue, &k); printf("%d ",k); } printf("\n"); return 0; }

2015年3月20日 · 2 分钟 · Jid

把数组的前k位逆置:递归算法和迭代算法

把数组的前k位逆置 /* * 逆置数组arr的前k位: * (1)递归实现 * (2)迭代实现 * PS.通常递归算法能解决一些不能直接解决的问题, * 但是递归算法通常要做出效率上的牺牲 * By Guv 2011.06.04 * */ #include <stdio.h> /*递归实现*/ void invert(int arr[], int k) { if(k>1){ invert(arr+1,k-2); int tmp = arr[0]; arr[0] = arr[k-1]; arr[k-1] = tmp; } } /*迭代*/ /* void invert(int arr[], int k) { int tmp=0, mid = k/2; if (k<2) return; for(int i=0;i<mid;++i){ tmp = arr[i]; arr[i] = arr[k-1-i]; arr[k-1-i] = tmp; } } */ /*testing*/ int main() { int array[] = {1,2,5,9,8,7,6,3,5,6,7,8,9,5,6,4,1,5,2,6,3,5}; int num = sizeof(array)/sizeof(int); printf("before inverted:"); for(int i=0;i<num;++i){ if (i%5==0) printf("\n"); printf("%d, ", array[i]); } invert(array, num); printf("\nafter inverted:"); for(int i=0;i<num;++i){ if (i%5==0) printf("\n"); printf("%d, ", array[i]); } }

2015年3月19日 · 1 分钟 · Jid

使用Google Analytics跟踪404页面

404页面是当访问者输入了错误的地址或者访问了被删除的页面时,服务器返回的错误页面(404 HTTP 状态代码)。这个页面除了告诉访问者页面不存在以外,不提供任何有价值的信息。访问者可能就此离开网站。 了解404页面的信息非常有用,可以发现访问者要查找的内容和推介来源,有助于网站补充新的内容并修复有问题的链接。如何使用Google Analytics来追踪并显示404页面的情况?Google Analytics的官方博客介绍了一个简单的方法,使用Google Analytics可以跟踪网站的404页面错误。 (1) 将网站的Google Analytics追踪代码添加到404 页面里。 (2) 修改404页面的Google Analytics代码,将代码修改为一下形式: <script type="text/javascript" src="http://www.google-analytics.com/urchin.js"> </script> <script type="text/javascript"> _uacct = "xxxxx-x"; urchinTracker("/404.html?page=" + _udl.pathname + _udl.search); </script> (3) 在热门内容报告中即可查看/404.html页面的报告,里面的信息包括出现错误的URL地址,还会显示访问者上一个访问的页面(推介来源)。通过这些信息,可以及时检查相关页面,修改错误链接。 转自:月光博客 英文原文:Tip: Tracking 404 Pages

2015年3月19日 · 1 分钟 · Jid

用C语言实现简单的链式栈结构

C语言实现简单的链式栈结构 /* * 用链式存储结构实现的栈称为链栈。若链栈元素的数据类型为valuetype,以LinkStack记链栈结构,其类型定义为: * typedef struct node * { * valuetype data; * struct node * next; * } StackNode, *LinkStack; * * 由于栈的主要操作都是在栈顶进行的,因此把链表的头部作为栈顶。设top为栈顶指针,即:LinkStack top. * 下面为各函数的功能说明: * (1)LinkStack Init_LinkStack() : 建立并返回空的链栈 * (2)int Empty_LinkStack(LinkStack top) : 判断top所指链栈是否为空 * (3)LinkStack Push_LinkStack(LinkStack top, valuetype x) : 将数据x压入top所指的栈顶,并返回新栈指针 * (4)LinkStack Pop_LinkStack(LinkStack top, valuetype *x) : 弹出top所指链栈的栈顶元素x,返回新栈指针 * */ #include <stdio.h> #include <malloc.h> typedef int valuetype; typedef struct node { valuetype data; struct node * next; } StackNode, *LinkStack; LinkStack Init_LinkStack() { return NULL; } int Empty_LinkStack(LinkStack top) { if (top==NULL) return 1; else return 0; } LinkStack Push_LinkStack(LinkStack top, valuetype x) { StackNode *s = (StackNode *)malloc(sizeof(StackNode)); s->data = x; s->next = top; return s; } LinkStack Pop_LinkStack(LinkStack top, valuetype *x) { StackNode *p; if (top==NULL) return NULL; else { *x = top->data; p = top->next; free(top); return p; } } int main() { LinkStack linkstack = Init_LinkStack(); int i=0; int x=0; for (i=0;i<10;++i) { linkstack = Push_LinkStack(linkstack, i); } while(linkstack) { linkstack = Pop_LinkStack(linkstack, &x); printf("%d ",x); } printf("\n"); }

2015年3月18日 · 1 分钟 · Jid

强烈推荐:C++ manpages -- C++在线帮助文档

C++ manpages – C++在线帮助文档 C++ manul pages generater: cppman generates C++ manual pages from cplusplus.com and provide a man-like interface to view man pages. PPA can be found here:https://launchpad.net/~aitjcize/+archive/manpages-cpp 此manpages与Linux自带的manpage一脉相承,虽然使用方式上稍有不同,但是文档格式非常一致。 此manpages是C++程序员的必备工具,虽然还有一个与此很相似的文档libstdc++6-4.4-doc,但是由于那个文档的格式与Linux中的manpage差别较大,使用很不方便。因此,这里极力推荐此manpage。 如下(本文主要在Ubuntu下操作): (1)向系统中添加PPA(即源),并更新 sudo add-apt-repository ppa:aitjcize/manpages-cpp sudo apt-get update (2)安装程序 manpages-cpp sudo apt-get install manpages-cpp (3)从Cplusplus网站上获取数据:这一步比较漫长,先去泡杯咖啡吧 cppman -c (4)畅游cppman cppman cout cppman iterator (5)获取帮助 cppman --help

2015年3月17日 · 1 分钟 · Jid

C++ man pages的使用

继上篇:安装C++ man pages 后,本篇介绍怎么在C++ man pages中查询C++的函数。 在Linux下查询命令或函数的使用,通常是这样: man printf man 3 printf man cat 但是为了避免造成操作系统、C语言与C++的混淆,目前安装的C++ man pages与上面的查询命令有一些不同,主要是加了命名空间的限定,也就是说用这样的命令 : man cout , 是查询不到的。 正确的方法应该是: man std::iostream ,之后再通过搜索/cout,找到cout的说明 也就是说现在的查询命令应该是 man namespace::header man 命名空间::头文件 下面是英文原文: How many times did you try on the terminal the following command and got frustrated $ man coutNo manual entry forcout If you have decided that there is no way you can find more about cout apart from going to web, then read the article on how to install C++ man pages? ...

2015年3月16日 · 1 分钟 · Jid