-6

我不记得问题是从哪里来的..但我是通过以下方式来的:

如果用户输入 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--------

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

你能给出任何相同的算法/逻辑吗..谢谢..

4

4 回答 4

2

您只需以某种模式打印 M = n*(n+1) 个数字,例如..

设 n=5 m=30 所以,

列表 = 1,2,3,4,5,.....26,..30

第 (1) 行有(前 n 个数字后跟 list 的最后 n 个数字)

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

更新列表=6,7,..25

第 (2) 行有(前 n-1 个数字后跟 n-1 个 list 数字)

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

名单)

您需要做的就是不断更新成型线上的列表并以您需要的图案打印它们。

于 2013-04-24T08:42:47.807 回答
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;
    }
}
于 2013-04-24T09:13:07.043 回答
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

足够的线索?

于 2013-04-24T08:44:33.667 回答
1

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

我们可以看到第一行的大小2n(对于这个 V1 是变量)并且第一个n数字是1通过n(对于这个 V2 有一个变量)接下来的 n 个数字是n*n+1通过n*n+n(对于这个 V3 有一个变量)

第二行的大小2n-2,所以第一行是n-1前一个 V1 的延续,第二行n-1n*(n-1)through n*(n-1)+n

对其余的行执行此操作..

最后一行应该以(n-1) == 1.

演示:对于 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------

第 5 名

--------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;
}
于 2013-04-24T08:50:13.247 回答