III.2 testul 1 (antrenament) 2020
Subiectul al III-lea – Exerciţiul 2
| Scrieţi un program C/C++ care citeşte de la tastatură două numere naturale din intervalul [2,20], n și k, şi construieşte în memorie un tablou bidimensional cu n linii şi n∙k coloane, numerotate începând cu 1, astfel încât fiecare linie i (i∈[1,n]) memorează un şir crescător de termeni cu proprietatea că primul termen este i, fiecare valoare apare în şir de exact k ori și oricare doi termeni alăturați au valori egale sau consecutive. Programul afişează pe ecran tabloul construit, fiecare linie a tabloului pe câte o linie a ecranului, cu valorile aflate pe aceeaşi linie separate prin câte un spaţiu. Exemplu: dacă n=4 și k=3, se afişează pe ecran tabloul alăturat. |

Numerele n și k au valoarea maximă 20, așadar tabloul cu n∙k coloane va avea cel mult 400 de coloane. Liniile și coloanele fiind numerotate de la 1, avem declararea tabloului int a[21][401].
Elementele primei coloane sunt egale cu indicele liniei. Celelalte elemente sunt egale cu “vecinul” din stânga sau cu 1 mai mari decât “vecinul” din stânga (elementul situat pe aceeași linie și coloana anterioară). Grupele de câte k coloane cu elemente egale pot fi asociate cu restul împărțirii la k. Parcurgând o linie, cu ușurință se observă că schimbarea valorii unui element față de “vecinul” din stânga se face pe coloana cu indice de forma (1+ multiplu de k). De aici condiția j%k==1, unde j este indicele coloanei.
#include<iostream>
using namespace std;
int main()
{
int n,k,a[21][401],i,j;
cin>>n>>k;
for(i=1;i<=n;i++)
for(j=1;j<=n*k;j++)
if(j==1)
a[i][j]=i;
else
if(j%k==1)
a[i][j]=a[i][j-1]+1;
else
a[i][j]=a[i][j-1];
for(i=1;i<=n;i++)
{for(j=1;j<=n*k;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}