需要帮助生成某种哈希模式

时间:2016-02-12 08:43:45

标签: c++

我一直试图生成一个看起来像这样的哈希模式:

#            #
 ##        ##
  ###    ###
   ########

我的代码是: -

#include <iostream>

using namespace std;

int main()
{
int pro = 1;
int space2= 12;
int handle = space2;
int space = 3;
int handle2 = space;

for (int i = 2 ; i <=8 ; i = i+2)
{

    space = handle2;
    handle = space2;


    int k = i;
    while (k > 0)
    {
        if (k == i/2)
        {

            while (space2 > 0)
            {
                cout << " ";
                space2--;

            }

            cout << "#";
            k--;
        }
        else
        {
            if (i > 2){
                while (space <=3){
                    cout << " ";
                    space ++;
                }
                handle2 --;
            }
            cout << "#";
            k--;
        }

    }
    space2 = handle - 4;
    cout << endl;
}

return 0;
}

我很确定我做了一些愚蠢的错误,但我似乎无法找到答案。此代码生成的模式具有正确的哈希值,但它在空格中混乱。谁能告诉我哪里出错了?只是错误,我想知道如何自己纠正它。谢谢!

输出: -

#            #
 ##        ##
    ###    ###
         ########

2 个答案:

答案 0 :(得分:3)

这是一种方法,可让您通过更短的程序解决问题:将模式分解为多个部分,并根据行号描述其大小。

首先要注意的是你的图案是对称的:它的右边是它左边的镜像。将模式分成两半会给你下一个观察结果:两半是七个字符宽:

#      |      #
 ##    |    ##
  ###  |  ###
   ####|####

1234567 7654321

每行的左侧包含p个空格的前缀,长度为h的octothorp,以及s个空格的后缀。前缀p和后缀s的长度可以为零。右侧由后缀组成,后跟octothorps;前缀是空格,因此可以省略。

现在让我们计算每行的phs的值。假设行从零开始编号(因为C ++中的东西通常从零开始编号):

  • p对于初始行为零,一个用于下一行,两个用于下一行,依此类推。因此,p等于row数字。
  • h是一行用于初始行,两行用于下一行,依此类推。因此,hrow+1
  • s始终为7-p-h,使其成为7-row-(row+1),即6-2*row

有了这些观察结果,您需要做的就是编写一个打印n个字符的函数,并从循环中重复调用它,传递字符和计数:

void printRepeatedCharacter(char c, int n); // Implement this

你的循环看起来像这样:

for (int row = 0 ; row != 4 ; row++) {
    printRepeatedCharacter(' ', row);     // prefix
    printRepeatedCharacter('#', row+1);   // #-s, left part
    printRepeatedCharacter(' ', 6-2*row); // suffix, left part
    printRepeatedCharacter(' ', 6-2*row); // suffix, right part
    printRepeatedCharacter('#', row+1);   // #-s, right part
    cout << endl;
}

答案 1 :(得分:1)

您的代码似乎有点复杂,但让我们分析您要做的事情。你想生成这样的模式:

#------ ------#
-##---- ----##-
--###-- --###--
---#### ####---

它在中间对称(我留下一个空格),其他线条遵循规则图案,可用以下数字描述(从左到右:空格数,散列数,空格数)这只是左侧,右侧是相同的模式反转):

0 1 6
1 2 4
2 3 2
3 4 0

生成这种模式的最佳方法是提出生成这些数字的函数。我们试试吧:

int main () {
    const int NumIterations = 4;

    for (int x=0; x<NumIterations; ++x) {
        // print 'x' spaces
        // print 'x+1' hashes
        // print '(NumIterations - x - 1) * 2' spaces

        // print '(NumIterations - x - 1) * 2' spaces
        // print 'x+1' hashes
        // print 'x' spaces
    }
}

让我们添加一个打印功能:

void print (char c, int count) {
    for (int x=0; x<count; ++x)
         cout << c;
}

现在我们的主要功能可以成为:

int main () {
    const int NumIterations = 4;

    for (int x=0; x<NumIterations; ++x) {
        print (' ', x);
        print ('#', x+1);
        print (' ', (NumIterations - x - 1) * 2);
        print (' ', (NumIterations - x - 1) * 2);
        print ('#', x+1);
        print (' ', x);
    }
}

当然,您可以通过组合中间两个打印语句来进一步优化它,您可能想要省略最终的打印语句:

int main () {
    const int NumIterations = 4;

    for (int x=0; x<NumIterations; ++x) {
        print (' ', x);
        print ('#', x+1);
        print (' ', (NumIterations - x - 1) * 4);
        print ('#', x+1);
    }
}

就是这样。希望这有帮助!