可以更有效地写入这种图案打印算法吗?

问题描述:

这是我的问题可以更有效地写入这种图案打印算法吗?

//to print this diamond 
    /* 
     1 
     121 
     12321 
    1234321 
     12321 
     121 
     1 

     */ 

,这是我试过的解决方案,我想象的问题,因为6个直角三角形,并试图解决如下

#include<stdio.h> 

    int main() 
    { 

    //The number n is at the heart of the pattern ,4 in this case 
    int i,j,k,l; 
    int n=4; 

    //do it in 2 steps top+bottom 
    //consider we are in line 4 ie 1234321 

     //top 
     for(i=0;i<n;i++) 
     { 
     //print spaces 
      for(j=0;j<(n-i-1);j++) 
      { 
      printf(" "); 
      } 
     //print first half ie 1234 
      for(k=0;k<=i;k++) 
      { 
      printf("%d",(k+1)); 
      } 
     //print the second haf ie 321 
      for(l=i;l>0;l--) 
      { 
      printf("%d",l); 
      } 
     //next line 
     printf("\n"); 
     } 

    //consider we are in line 5 ie 12321 

     //bottom 
     for(i=(n-2);i>=0;i--) 
     { 
     //print spaces 
      for(j=(n-1);j>i;j--) 
      { 
      printf(" "); 
      } 
     //print left half ie 123 
      for(k=0;k<=i;k++) 
      { 
      printf("%d",(k+1)); 
      } 
     //print right half 
      for(l=i;l>0;l--) 
      { 
      printf("%d",l); 
      } 
     //next line 
     printf("\n"); 
     } 

    return 0; 
    } 

现在我需要的人数减少在这里使用的循环(不要太在意实际的时间和空间的复杂性),我的目标是只减少循环的数量,任何人都可以请建议如何或尝试减少循环的次数和回答

谢谢!

+0

取而代之,尝试以递归方式编写代码,以便我t一般可以使用。它会真的帮助你减少循环的次数 –

+0

是的,但我想任何解决方案没有递归 –

+0

你是什么意思'int n = 9 = 4;'? –

可以使用abs()功能得到增加/减小序列:

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

int main() { 
    const int N = 5; /* center value = length of edge of diamond */ 
    int i, j, k; 
    for(i=1 ; i<2*N ; ++i) { 
    j = N-abs(N-i); /* center value of row */ 
    printf("% *d", N-j+2, 1); 
    for(k=2 ; k<2*j ; ++k) putchar(j-abs(j-k)+'0'); 
    putchar('\n'); 
    } 
    return 0; 
} 

输出:

 1 
    121 
    12321 
    1234321 
123454321 
    1234321 
    12321 
    121 
    1 

可以使用min函数来代替两个 '数字' 循环一个:

static inline int min(int x, int y) { return (x < y) ? x : y; } 

int N = 2 * (n - 1); 
for (int k = 0; k <= N; k++) 
    putchar(min(k, N-k) + '0' + 1); 

对于n == 4N == 6,你会得到:

k 0 1 2 3 4 5 6 
N-k 6 5 4 3 2 1 0 
min 0 1 2 3 2 1 0 

,然后打印数字对应于'min + 1'。这样做的成本是每个迭代中min函数的条件。

如果您确实坚持,可以在较大范围内的循环内进行更多条件计算,当索引低于一个阈值时打印空格,并使用基于阈值后的min函数的公式打印数字。

您可以卸载图像生成到一个函数,以减少循环计数两个:

char diamondChar(int x, int y) { 
    if(x < 0) x = -x; 
    if(y < 0) y = -y; 
    int value = 4 - x - y; 
    return (value <= 0) ? ' ' : '0' + (char)value; 
} 

int main() { 
    for(int y = -3; y <= 3; y++) { 
     for(int x = -3; x <= 3; x++) { 
      putchar(diamondChar(x, y)); 
     } 
     putchar('\n'); 
    } 
}