оптимизировать код, чтобы получить следующий вывод в c - PullRequest
0 голосов
/ 19 октября 2019

У меня было интервью на прошлой неделе. они попросили меня написать код для печати следующим образом:

input :5
     0
    101
   21012
  3210123
 432101234
54321012345

Я написал приведенный ниже код, но он сказал, что могу оптимизировать это больше. Я не могу понять это. ,

int main(){
  int n,i,j,k,lim,num;
  scanf("%d",&n);//getting input starting number of last row
  lim=n;
  int collen=n+2;//it denotes end of row 
  for(i=0;i<n+1;i++)
  {
    num=i;
    k=0;
    for(j=0;j<collen-1;j++){
      if(j<lim)
        printf(" ");
      else if(num<0){

        printf("%d",++k);
      }
      else{
        printf("%d",num--);

      }
   }//j for
   printf("\n");
   collen++;
   lim--;
  }//i for
}// main end

у меня другой код с первой попытки, я использовал флаг, чтобы определить, когда num достигает для увеличения и уменьшения, было сложно, было около 4, если во втором цикле, поэтому я оптимизировал этот код довыше одного. он сказал, вы можете оптимизировать больше? я понятия не имею, как его оптимизировать.

мой вопрос: можно ли его оптимизировать?, если это возможно, пожалуйста, отправьте код

Ответы [ 3 ]

0 голосов
/ 19 октября 2019
  1. Количество for циклов больше, чем у <. for(i=0;i<n+1;i++) гораздо понятнее записать как for (i = 0; i <= n; i++).
  2. Если вы инициализируете значение, например int collen=n+2;, а затем используете его как collen-1, сохраните вычитание и инициализируйте его с поправкой.
  3. Разделите этот сложный внутренний цикл с if s на их собственные циклы.
  4. Используйте меньше переменных.
  5. Используйте больше и непротиворечивый пробел.

ИТеперь мое решение, но, как и ваше, оно может обрабатывать ввод только от 0 до 9:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n;

    printf("input :");
    if (scanf("%d", &n) != 1 || n < 0 || n > 9) {
        printf("input not recognized or invalid\n");
        return EXIT_FAILURE;
    }

    for (int i = 0; i <= n; ++i) {
        printf("%*d", n - i + 1, i);
        for (int j = i - 1; j >= 0; --j) {
            printf("%d", j);
        }
        for (int j = 1; j <= i; ++j) {
            printf("%d", j);
        }
        printf("\n");
    }
    return EXIT_SUCCESS;
}
0 голосов
/ 20 октября 2019
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Print a pyramid */

int
main(int argc, char **argv)
{
        int size = argc > 1 ? strtol(argv[1],NULL,10) : 5;
        if( size > 9 || size < 0) {
                fprintf(stderr, "Invalid size\n");
                return EXIT_FAILURE;
        }
        for(int line = 0; line <= size; line++) {
                char template[]="9876543210123456789";
                char *s = template + 9 - size;
                template[10 + line] = '\0';
                memset(s, ' ', size - line);

                if(puts(s) == EOF) {
                        perror("puts");
                        return EXIT_FAILURE;
                }
        }
        return EXIT_SUCCESS;
}
0 голосов
/ 19 октября 2019

Это выглядит оптимизированным до краев:

int main( int argc, char **argv )
{
    puts( "input :5");
    puts( "     0");
    puts( "    101");
    puts( "   21012");
    puts( "  3210123");
    puts( " 432101234");
    puts( "54321012345");
}
...