算法设计步步高:1.入手从最容易想到的分析开始写代码 2.分析补缺 3.补漏及完善 4.稍事优化

来源:互联网 发布:mac好用的mysql客户端 编辑:程序博客网 时间:2024/05/29 15:06
1.入手从最容易想到的分析开始写代码:从1-10中一个只有6和8,11-20只有一个16和18,如此类推写如下代码:int a = 0;do{printf_s("%d ", a * 10 + 6);printf_s("%d ", a * 10 + 8);++a;} while (a<500);2.分析补缺:写好上面代码后运行,对结果进行分析和推敲,发现60和80也是符合题目的数,之后还有160和180等如上类推一样,写代码如下:int a = 0;do{printf_s("%d ", a * 10 + 6);printf_s("%d ", a * 10 + 8);if (a<50){printf_s("%d ", (a * 10 + 6) * 10);printf_s("%d ", (a * 10 + 8) * 10);}/*如果不要求顺序的算法:*/++a;} while (a<500);3.补漏及完善:之上分析首先想到的是60和80,再仔细分析发现漏掉了61-69和81-89也是符合题意的,之上代码加上0-9数的循环即可,同时写出按顺序插入代码;int a = 0, aa = 0, aaa = 0;do{while (a == (aa * 10 + 6))/*按顺序插入输出*/{printf_s("%d ", a * 10 + aaa);if (++aaa > 9){ aaa = 0; break; }}while (a == (aa * 10 + 8)){printf_s("%d ", a * 10 + aaa);if (++aaa > 9){ aaa = 0; break; }}if (a != (aa * 10 + 6))if (a != (aa * 10 + 8)){printf_s("%d ", a * 10 + 6);printf_s("%d ", a * 10 + 8);}//if (a<50)//{//while (aa < 10) printf_s("%d ", (a * 10 + 6) * 10 + aa++);/*循环补缺*///while (aaa < 10) printf_s("%d ", (a * 10 + 8) * 10 + aaa++);//aa = 0; aaa = 0;//}/*如果不要求顺序的算法:*/if (a == (aa * 10 + 8)) ++aa;++a;} while (a<500);/*写算法主要通过分析一步步解决问题,最后得到完整算法,比起其他循环效率不止提高10倍,无论是循环用步进1或2.如果步进为1则输出6和8要循环10次,如果步进为2则要循环5次,而我这个只需循环一次,除了大等于十位的数是6或8要循环10次外,如60-69,80-89,160-169,180-189等,这些都是可以写为算法的,这样才称为算法。*/4.稍微优化语句更简洁:int a = 0, aa = 0, aaa = 0;do { while (a == (aa * 10 + 6)||a == (aa * 10 + 8)) { printf_s("%4d ", a * 10 + aaa); if (++aaa > 9){ aaa = 0; break; } } if (a != (aa * 10 + 6)) if (a != (aa * 10 + 8)) { printf_s("%4d ", a * 10 + 6); printf_s("%4d ", a * 10 + 8); }if (a == (aa * 10 + 8)) ++aa; } while (++a<500);当然,以上代码还可以进一步优化深度,也可以更改写法,但逻辑和道理是不变的,留给后人自便了。
/*用C语言写,2到5000中含6和8的数,急需,希望大神指教一下,哎,新手好难答*/


0 0
原创粉丝点击