C语言分支循环作业错题与心得
C语言–分支循环作业的一些心得flag逻辑例题《打印100-200的素数》for(n100;n200;n){intis_prime1;//flag逻辑// 关键优化算一次平方根并强制转换为 int (会自动向下取整)// 比如 sqrt(101) 10.0498存进 limit 就会变成干净的 10intlimit(int)sqrt(n);// 循环条件里只做简单的整数比较速度极快for(d2;dlimit;d){if(n%d0){is_prime0;break;}}if(is_prime1){printf(%d ,n);}} Flag 逻辑三部曲搜寻与定论在处理“判断某个属性是否存在”的问题时比如这一堆数里有没有坏蛋这个数是不是素数我们通常采用 “假设 — 验证 — 判决” 的模式初始假设预设为真进入搜查循环前先插上一面旗int is_prime 这代表我们先假设这个数是完美的素数。搜寻反例一票否决进入 for 循环开始一个一个试除。关键点只要发现哪怕一个反例n % d 0这面旗子就倒下了is_prime 0;。效率点旗子一旦倒下就没必要再查后面的数了直接 break 跳出。最终判决看旗行事循环彻底结束后不管是查完了还是中途 break 了我们去检查那面旗子。如果旗子依然立着 ( 1)说明经过千锤百炼都没有找到反例这时候才宣布它是素数。算术中出现了正负号依次出现例题《计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值打印出结果》#define_CRT_SECURE_NO_WARNINGS1#includestdio.hintmain(){intn0;doublesum0.0;intsign1;//从正号开始for(n1;n100;n){sumsumsign*(1.0/n);sign-sign;//正负号依次出现}printf(%lf,sum);return0;}代码sign-sign在循环中可以使正负号依次出现