問題を行に分割します。与えられた数が であると仮定しn
ます。
最初の行はサイズ2n
(この V1 では変数) であり、最初のn
数値は1
通過n
(この V2 では変数) であり、次の n 数値はn*n+1
通過n*n+n
(この V3 では変数)であることがわかります。
2 行目はサイズな2n-2
ので、1行n-1
目は前の V1 の続きで、2 行目n-1
は n*(n-1)
スルーn*(n-1)+n
です。
残りの行に対してこれを行います..
最後の行は で終わる必要があり(n-1) == 1
ます。
デモ: n = 5 の場合、最初のメジャー ループ
1.2.3.4.5.26.27.28.29.30
2 番目のメジャー ループ
--6.7.8.9.22.23.24.25--
3 番目のメジャー ループ
----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;
}