用printf制成的三角形由内框架组成

时间:2014-11-23 15:51:53

标签: c printf

我之前发过一个关于类似想法的问题,但是有一个矩形, 这一次,我得到了一个任务,我应该以这种方式画一个等腰直角三角形: 我得到三角形边缘的大小作为用户的输入; 三角形的角度将位于屏幕的左上角,三角形的框架将由字母a构成,内部三角形的框架将由b构成,内部三角形的内部框架的内部框架将由c等等......

例如:

aaaaaaaaaaaa
abbbbbbbbba
abccccccba
abcdddcba
abcddcba
abcdcba
abccba
abcba
abba
aba
aa
a

这是我到目前为止所得到的:

#include <stdio.h>
int main()
{

int length, originalLength;
int counterRows, counterLength;

scanf("%d", &length);
originalLength=length;


for (counterRows=0 ; length > 0; --length, ++counterRows)
{
    for(counterLength=0; counterLength<length ;++counterLength)
    {
        if (counterRows == 0 || counterLength >= originalLength - 2)
            printf("%c",'a');
        else if (counterRows == 1 || counterRows == originalLength -3)
            if (counterLength == 0 || counterLength == length -1)
                printf("%c",'a');
            else
                printf("%c",'a'+1);
        else
            if (counterLength == 0 || counterLength == length - 1)
                printf("a");
            else if (counterLength == 1 || counterLength == length - 2)
                printf("%c",'a'+1);
            else
                printf("%c",'a'+2);
    }
    printf("\n");
}
return 0;
}

然后我注意到我不断重复自己,直到我到达字母z,我才能真正做到这一点。还有什么更好的方法可以用于这种算法?谢谢!

2 个答案:

答案 0 :(得分:1)

计算一般结构的一种方法是观察三角形行内有三角形图案。考虑一个大小为10的三角形,这意味着顶行是10个字符长。看看前四行:

    aaaaaaaaaa
    abbbbbbba
    abccccba
    abcdcba

    abccba
    abcba
    abba
    aba
    aa
    a

第一行有 10 'a' 个字符,第二行有 7 'b' 个字符, 4 {{1第三行中的字符,第四行中的 1 'c' 字符。我们可以将这些行分解为中间段和外段:

'd'

中间段的长度为 aaaaaaaaaa aaaaaaaaaa .......... abbbbbbba .bbbbbbb. a.......a abccccba ..cccc.. ab....ba abcdcba ...d... abc.cba ,其中size-3*i是顶行的长度,size是行索引,从顶部的0开始。外部细分由左侧i'a'的字符组成,右侧为相反的序列。

三角形的底部怎么样?它在'a'+i-1为负时启动。

size-3*i

每行都有一个上升和下降的字符序列。例如,在六个字符的行中,我们可以通过将0,1,2,2,1,0顺序添加到基本字符 abccba abcba abba aba aa a 来计算每个字符。

'a'

在五个字符的行中,序列为0,1,2,1,0:

    a b c c b a
    0 1 2 2 1 0

通常,对于一行 a b c b a 0 1 2 1 0 个字符,索引length处的字符的值为j'a'+j,以较小者为准。

让我们用一行六个字符来说明这一点。

'a'+length-1-j

总而言之,我们可以使用以下代码生成三角形。

    n = 6:
                j  =  0  1  2  3  4  5
            n-1-j  =  5  4  3  2  1  0
    min(j, n-1-j)  =  0  1  2  2  1  0

下面是一个完整的程序,它从命令行获取三角形的大小。您可以使用 for (i = 0; i < size; ++i) { middle = size-3*i; if (middle >= 0) { /* Upper portion of the triangle. */ for (j = 0; j < i; ++j) { printf("%c", 'a'+j); /* Left segment: abc... */ } for (j = 0; j < middle; ++j) { printf("%c", 'a'+i); /* Middle: size-3*i characters */ } for (j = i-1; j >= 0; --j) { printf("%c", 'a'+j); /* Right segment: ...cba */ } } else { /* Now we're in the lower portion. */ length = size-i; for (j = 0; j < length; ++j) { printf("%c", 'a'+(j < length-1-j ? j : length-1-j)); } /* Rising and falling sequence. */ } printf("\n"); } 轻松修改它以读取所需的大小,就像您在问题中显示的代码一样。

scanf

答案 1 :(得分:0)

#include <stdio.h>

#define min(a,b) a < b ? a : b

void print_line(int len, int row, int level){
    int deep = min(row, level);
    if(len > 1){
        putchar('a' + deep);
        print_line(len-2, row, level + 1);
        putchar('a' + deep);
    } else if(len == 1){
        putchar('a' + deep);
    }
}

int main(){
    int length, originalLength;
    int i;

    scanf("%d", &length);
    originalLength=length;
    for(i=0; i< originalLength; ++i){
        print_line(length--, i, 0);
        putchar('\n');
    }
    return 0;
}