写代码,有两类追求,一种是追求实用(Coder),一种是追求代码艺术(Artist)我是那种追实用追腻了,偶然追一下艺术(就是偶然和艺术有一腿)的那种Coder很多人,已经习惯了for(i=0;i<n;i++)这种单调的循环,虽然这的确的使用率最高,但在特殊场合,特殊的循环写法,不但能提升循环的效率,,很多人可能会直接这样写:intisPrime(intn)//函数返回1表示是质数,返回0表示不是质数{ inti; for(i=2;i<n;i++) if(n%i==0) break; returni>=n;}又或者,有的人知道平方根的优化:intisPrime(intn){ inti,s=(int)(sqrt((double)n)+); for(i=2;i<=s;i++) if(n%i==0) break; returni>s;}再或者,消除偶数:intisPrime(intn){ inti,s=(int)(sqrt((double)n)+); if(n<=3)return1; if(n%2==0)return0; for(i=3;i<=s;i+=2) if(n%i==0) break; returni>s;}当然,这样还不是很够的话,我们可以考虑这个事实:所有大于4的质数,被6除的余数只能是1或者5比如接下来的5,7,11,13,17,19都满足所以,我们可以特殊化先判断2和3但后面的问题就出现了,因为并非简单的递增,从5开始是+2,+4,+2,+4,....这样递增的这样的话,循环应该怎么写呢?首先,我们定义一个步长变量step,循环大概是这样for(i=5;i<=s;i+=step)那么,就是每次循环,让step从2变4,或者从4变2于是,可以这么写:#include<>#include<>intisPrime(intn){ inti,s=(int)(sqrt((double)n)+),step=4; if(n<=3)return1; if(n%2==0)return0; if(n%3==0)return0; for(i=5;i<=s;i+=step) { if(n%i==0) break; step^=6; } returni>s;}intmain(){ intn; for(n=2;n<100;++n)//找出2-100的质数并输出 { if(isPrime(n))printf("%d,",n); } getchar(); return0;}如上代码,一个step^=6;完成step在2和4之间转换(这个^符号是C里的异或运算)理由是,2化二进制是010,4是100,6是110,于是2异或4得到6:2^4=>66^2=>46^4=>2于是利用异或,就可以构造这种步长在两个值之间来回变化的循环思考题:前面说的是双值循环,那么如何构造三值或者四值循环?,打印菱形在控制台的思路是
C语言循环的小艺术 来自淘豆网m.daumloan.com转载请标明出处.