我不记得问题出在哪里..但我通过以下方式得出结论:
如果用户输入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()
。
你可以给同一个算法/逻辑吗? 感谢..
答案 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
号为1
到n
(有一个变量) V2)接下来的n个数字是n*n+1
到n*n+n
(具有此V3的变量)
第二行的大小为2n-2
,因此第一行n-1
是之前V1的延续,第二行n-1
为n*(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;
}