最近遇到一个问题,写代码之前我没有思考算法,直接蒙头大写特写,跑起来遇到问题这里修修那里补补,最后跑是能跑出正确结果,但是整个框架看起来很恶心。变量巨多,维护成本很高。请问各位有什么办法提高写代码效率?有什么书籍推荐?
比如:本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
我写的代码是这样的(感谢大家花时间看我制造的屎):
#include
//我悟了!!循环条件里加入变量,变量自增放在前,就可以避免多输出一组!!
//还要保证min>=0
int main(){
int N;
char sign;
scanf("%d ",&N);
scanf("%c",&sign);
int min,i=1;
min=N-1;
while (min>=i)
{
i += 2;
min -= 2*i;
}
if (min<0)
{
min += 2*i;
i -= 2;
}
//printf("min=%d,i=%d\n",min,i);
int j,m,temp=i+2; //j记录行号,m记录列号,行i/2,temp增2
for (j=0;jif (j<=i/2)
{
for (int k=j;k>0;k--)
{
printf(" ");
}
temp -= 2;
for (m=temp;m>0;m--)
{
printf("%c",sign);
}
} else {
temp += 2;
for (int k=(i-temp)/2;k>0;k--)
{
printf(" ");
}
for (m=temp;m>0;m--)
{
printf("%c",sign);
}
}
printf("\n");
}
printf("%d",min);
return 0;
}
代码结构:将生成沙漏的过程封装成了一个函数。
#include <stdio.h>
// 生成沙漏
void printHourGlass(int N, char sign) {
int min = N - 1;
int i = 1;
// 计算行数和剩余符号数
while (min >= i) {
i += 2;
min -= 2 * i;
}
if (min < 0) {
min += 2 * i;
i -= 2;
}
int j, count, width = i + 2;
// 生成沙漏
for (j = 0; j < i; j++) {
count = j <= i / 2 ? width -= 2 : width += 2;
int k;
for (k = 0; k < (i - count) / 2; k++) {
printf(" ");
}
for (k = 0; k < count; k++) {
printf("%c", sign);
}
printf("\n");
}
printf("%d", min);
}
int main() {
int N;
char sign;
scanf("%d %c", &N, &sign);
printHourGlass(N, sign);
return 0;
}
输入格式:
输入的第一行包含两个整数n,m,表示节目的数量。第二行包含n个整数,依次为每个节目的好看值。
输出格式:
输出一行包含m个整数,为选出的节目的好看值。
样例输入:
5 3
3 1 2 5 4
样例输出:
3 5 4
评测用例规模与约定:
对于30%的评测用例,1<=n<=20;
对于60%的评测用例,1<=n<=100;
对于所有评测用例,1<=n<=100000,0<=节目的好看值<=100000。