能否仅用1个循环与2个变量简化该C语言算法,替代原三变量实现?
问题解答
能否仅用变量a和b实现相同结果?
完全可以。原代码里的变量c本质是数组索引,用来记录当前处理的字符位置。我们可以通过变量a(当前组已输出的星号数)和b(当前组应输出的星号总数)的组合,计算出已经输出的字符总数,以此替代c的作用,不需要额外的索引变量。
1个循环+2个变量的简化实现
直接用两个变量维护状态,配合单循环即可完成,甚至可以去掉数组直接输出字符,逻辑更简洁:
#include <stdio.h> #include <stdlib.h> const int LENGTH = 20; int main() { int a = 0, b = 1; while ( (b == 1 ? a : (b-1)*(b+2)/2 + a ) < LENGTH ) { if (a < b) { putchar('*'); ++a; } else { putchar(' '); a = 0; ++b; } } putchar('\n'); return EXIT_SUCCESS; }
逻辑说明
a:记录当前分组内已经输出的星号数量,当a等于b时,说明当前组的星号已输出完毕,切换为输出空格。b:记录当前分组需要输出的星号总数,每完成一组(星号+空格)后,b递增1,进入下一组更多星号的输出。- 循环条件通过
a和b计算已输出的字符总数,判断是否达到指定长度LENGTH,完全替代了原代码中c的作用。
如果觉得循环条件的表达式有点复杂,也可以用循环变量配合a、b(此时循环变量仅作为计数,不算算法核心变量),代码可读性更好:
#include <stdio.h> #include <stdlib.h> const int LENGTH = 20; int main() { int a = 0, b = 1; for (int i = 0; i < LENGTH; ++i) { if (a < b) { putchar('*'); ++a; } else { putchar(' '); a = 0; ++b; } } putchar('\n'); return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者Theodore L'Heureux
相关产品推荐
相关产品推荐

