C语言循环的小艺术.docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言循环的小艺术C语言循环的小艺术

C语言循环的小艺术(质数判断,菱形打印,奇数阶幻方,字符串循环移位) 写代码,有两类追求,一种是追求实用(Coder),一种是追求代码艺术(Artist) 我是那种追实用追腻了,偶然追一下艺术(就是偶然和艺术有一腿)的那种Coder 很多人,已经习惯了for(i=0; in; i++)这种单调的循环,虽然这的确的使用率最高, 但在特殊场合,特殊的循环写法,不但能提升循环的效率,还能使代码更精巧 1. 质数判断 对于这个,很多人可能会直接这样写: int isPrime(int n) //函数返回1表示是质数,返回0表示不是质数 { ??? int i; ??? for (i = 2; i n; i++) ????????if (n % i == 0) ????????????break; ??? return i = n; } 又或者,有的人知道平方根的优化: int isPrime(int n) { ??? int i, s = (int)(sqrt((double)n) + 0.01); ??? for (i = 2; i = s; i++) ????????if (n % i == 0) ????????????break; ??? return i s; } 再或者,消除偶数: int isPrime(int n) { ??? int i, s = (int)(sqrt((double)n) + 0.01); ??? if (n = 3) return 1; ??? if (n % 2 == 0) return 0; ??? for (i = 3; i = s; i += 2) ????????if (n % i == 0) ????????????break; ??? return i 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 stdio.h #include math.h int isPrime(int n) { ??? int i, s = (int)(sqrt((double)n) + 0.01), step = 4; ??? if (n = 3) return 1; ??? if (n % 2 == 0) return 0; ??? if (n % 3 == 0) return 0; ??? for (i = 5; i = s; i += step) ??? { ????????if (n % i == 0) ????????????break; ????????step ^= 6; ??? } ??? return i s; } int main() { ??? int n; ??? for (n = 2; n 100; ++n) //找出 2 - 100 的质数并输出 ??? { ????????if (isPrime(n)) printf(%d,, n); ??? } ??? getchar(); ??? return 0; } 如上代码,一个 step ^= 6; 完成step在2和4之间转换(这个 ^ 符号是C里的异或运算) 理由是,2化二进制是010,4是100,6是110,于是2异或4得到6: 2 ^ 4 = 6 6 ^ 2 = 4 6 ^ 4 = 2 于是利用异或,就可以构造这种步长在两个值之间来回变化的循环 思考题:前面说的是双值循环,那么如何构造三值或者四值循环? 2.菱形打印 很多人,打印菱形在控制台的思路是,把菱形上下拆分,分两段很接近的代码来打印, 其实这样代码很不好看,并且不好阅读 我们知道,要打印的图案是这种: ??? * ???*** ??***** ???*** ??? * 满足上下对称,左右对称,那么,你能不能也弄一个二重循环,同样是对称的? 很简单,首先我们要抛开习惯性思维,for循环不一定要在0开始或者0结束 我们可以让循环从 -c 到 c ,这样不就轻松产生一个对称的吗?(只要取个绝对值) 我们把菱形的中心看成是坐标0,0,那么,会输出星号的坐标,是 |x| + |y| = c 的点 由此可得 #include stdio.h #define

文档评论(0)

yyanrlund + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档