模式绘制编程逻辑

时间:2013-04-24 08:25:43

标签: algorithm

我不记得问题出在哪里..但我通过以下方式得出结论:

如果用户输入3

输出应为:

1*2*3*10*11*12
--4*5*8*9--
----6*7----

如果5

然后,

1*2*3*4*5*26*27*28*29*30
--6*7*8*9*22*23*24*25--
----10*11*12*19*20*21----
------13*14*17*18------
--------15*16--------

正如您所看到的那样,我们正在从上到下打印数字然后再从下到上打印.. 我们不能使用任何格式化类型函数,因为我们在c ++中有setw()

你可以给同一个算法/逻辑吗? 感谢..

4 个答案:

答案 0 :(得分:2)

您只需打印M = n *(n + 1)个数字,如..

设n = 5 m = 30,

list = 1,2,3,4,5,..... 26,.. 30

第(1)行(前n个数字跟随最后n个数字列表)

第(1)行=(1,2..5)(26..30)

更新清单= 6,7,.. 25

第(2)行(第一个n-1个数字后跟n-1个数字列表)

类似Line(k)在列表中有(第一个(n + 1-k)个数字,后跟最后一个(n + 1-k)个数字

列表)

您需要做的就是不断更新成型生产线上的清单,并按照您所需的模式进行打印。

答案 1 :(得分:2)

C ++实现:

没有任何格式

void print(int n) {
    for(int i=n, cl=1, cr=n*n+1; i>0; cl+=i, --i, cr-=i) {
        for(int j=0; j<i; ++j) cout << cl+j;
        for(int j=0; j<i; ++j) cout << cr+j;
        cout << endl;
    }
}

使用破折号和星号

void print(int n) {
    for(int i=n, cl=1, cr=n*n+1; i>0; cl+=i, --i, cr-=i) {
        for(int j=0; j<n-i; ++j) cout << "--";
        for(int j=0; j<i; ++j) cout << cl+j << "*";
        for(int j=0; j<i; ++j) cout << cr+j << (j-i+1?"*":"");
        for(int j=0; j<n-i; ++j) cout << "--";
        cout << endl;
    }
}

答案 2 :(得分:1)

Max value = sum for n=1 to R ( n + 2 )
Where R is the user supplied value

e.g. R=5 Max Value = 2 + 4 + 6 + 8 + 10 = 30

so lowest row = Max Value / 2 : (15), Max Value / 2 + 1: (16), 
entity count = 2

next row
LHS = 15-2, 15-1
RHS = 16+1, 16+2
entity count = 4 (it always goes up 2 entities at a time)

and repeat until you get a 1 at LHS first value

足够的线索?

答案 3 :(得分:1)

确定将问题分成几行。假设给定的数字是n

我们可以看到第一行的大小为2n(此V1的变量),第一行n号为1n(有一个变量) V2)接下来的n个数字是n*n+1n*n+n(具有此V3的变量)

第二行的大小为2n-2,因此第一行n-1是之前V1的延续,第二行n-1n*(n-1)n*(n-1)+n

为剩下的行做这个..

最后一行应以(n-1) == 1结尾。

demo:对于n = 5 第一个主要循环

1.2.3.4.5.26.27.28.29.30

第二个主要循环

--6.7.8.9.22.23.24.25--

第三个主要循环

----10.11.12.19.20.21.

4rt

------13.14.17.18------

第五

--------15*16--------

现在针对 C

中的示例
#include<stdio.h>
int main()
{
    int num = 7,
        //linesize = 2*num,  
        //space = 0,
        fst = 1,
        snd = 0;

  if(num%2)                              //for odd n
    snd = (((num*num)+num)/2)+1;
  else                                     //for even n
    snd = (((num*num)+num)/2);  

const int diff = (num*num)-snd+1; //needed to offset snd from its value and print the temporary

//printf("%d\n",snd);    //debug
for(int i = 0 ; i < num ; i++)
{
    //linesize = 2*(num-i);                   // no of elements to print per line, debug
    //space = i;                                // no of space to print per line, debug
    for(int k = 0 ;k <i;k++)printf("   ");   //space before the values

    for(int j = 0;j<(num-i);j++)
    {
        printf("%d  ",fst++); //print fst n numbers
    }

    //printf(" ");

    for(int j = 0;j<(num-i);j++)
    {
            printf("%d  ",snd+j+diff); // print second n numbers
    }
    snd -= (num-(i+1)); //decrement snd
    for(int k = 0 ;k <i;k++)printf("   ");
    printf("\n");
}
return 0;
}