可以更有效地写入这种图案打印算法吗?
问题描述:
这是我的问题可以更有效地写入这种图案打印算法吗?
//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;
}
现在我需要的人数减少在这里使用的循环(不要太在意实际的时间和空间的复杂性),我的目标是只减少循环的数量,任何人都可以请建议如何或尝试减少循环的次数和回答
谢谢!
答
可以使用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 == 4
,N == 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');
}
}
取而代之,尝试以递归方式编写代码,以便我t一般可以使用。它会真的帮助你减少循环的次数 –
是的,但我想任何解决方案没有递归 –
你是什么意思'int n = 9 = 4;'? –