Algoritmul, pas cu pas
Cerința 1 — pandigital.
- Citesc ca șir de caractere și construiesc un vector de frecvență
freq[0..9]. - e pandigital dacă fiecare
freq[d]este exact . - Dacă da, afișez cifrele de pe pozițiile – (cele din mijloc). Dacă nu, afișez primele + ultimele cifre.
Cerința 2 — numărarea momentelor dintr-un an.
- Anul fiind fix, partea
aa(ultimele două cifre ale anului) e fixă. - Parcurg toate combinațiile: luna –, ziua –(numărul de zile al lunii, ținând cont de an bisect), ora –, minutul –.
- Pentru fiecare moment construiesc șirul
zzllaahhmm(fiecare câmp pe cifre) și verific cu un vector de frecvență dacă toate cifrele – apar o singură dată. - Număr câte momente trec testul.
Numărul de combinații e cel mult , deci parcurgerea completă e instantanee.
Soluția în C++
#include <fstream>
#include <string>
#include <cstdio>
using namespace std;
ifstream fin("10cifre.in");
ofstream fout("10cifre.out");
bool bisect(int y) { return y % 400 == 0 || (y % 4 == 0 && y % 100 != 0); }
int main() {
int C;
fin >> C;
if (C == 1) {
string N;
fin >> N; // exact 10 cifre
int freq[10] = {0};
for (char c : N) freq[c - '0']++;
bool pandigital = true;
for (int d = 0; d < 10; d++)
if (freq[d] != 1) pandigital = false;
if (pandigital) fout << N.substr(3, 4) << "\n"; // cele 4 din mijloc
else fout << N.substr(0, 2) << N.substr(8, 2) << "\n"; // primele 2 + ultimele 2
} else {
int an;
fin >> an;
int zile[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (bisect(an)) zile[1] = 29;
int cnt = 0;
for (int luna = 1; luna <= 12; luna++)
for (int zi = 1; zi <= zile[luna - 1]; zi++)
for (int ora = 0; ora < 24; ora++)
for (int min = 0; min < 60; min++) {
char s[11];
// forma zzllaahhmm, fiecare câmp pe 2 cifre
sprintf(s, "%02d%02d%02d%02d%02d", zi, luna, an % 100, ora, min);
int f[10] = {0};
for (int k = 0; k < 10; k++) f[s[k] - '0']++;
bool ok = true;
for (int d = 0; d < 10; d++)
if (f[d] != 1) ok = false;
if (ok) cnt++;
}
fout << cnt << "\n";
}
return 0;
}Greșeli frecvente
- Tratezi greșit anul bisect — februarie are de zile doar dacă anul e divizibil cu sau cu dar nu cu ; NU e bisect, și sunt.
- Afișezi răspunsul cerinței 1 ca număr — dacă cele cifre încep cu , un
intar pierde zeroul din față; păstrează-le ca șir de caractere. - Uiți completarea pe 2 cifre — ziua, luna, ora, minutul trebuie scrise mereu pe exact cifre (
05, nu5), altfel șirul nu mai are caractere.