Pagini recente » Monitorul de evaluare | Cod sursa (job #1649964) | Cod sursa (job #3197864) | Istoria paginii runda/simulare_oji_2023_clasa_10_14_martie/clasament | Cod sursa (job #1799108)
// O rezolvare de către Silviu Bogan a problemei „cifra”
// de pe www.infoarena.ro.
#include <fstream>
#include <cstring>
//#include <iostream>
using namespace std;
int cifra(char *x) {
//cout << "Procesare: " << x << endl;
int l = strlen(x); // Obținem lungimea șirului de caractere.
if (l == 1) { // Dacă lungimea este 1, tratăm șirul în mod special.
int c = x[0] - '0'; // Transformăm unicul caracter din șir în cifră.
int s = 0; // Facem o variabilă pt. suma finală.
// Pentru fiecare cifră din baza 10 de la 1 până la unica cifră din șir.
for (int i = 1; i <= c; i++) {
// i este cifra curentă.
// Calculăm U(i^i).
int cc = 1; // cc va reține U(i^i).
for (int j = 0; j < i; j++) {
// Ultima cifră a copiei este înmulțită cu ultima cifră a
// cifrei curente și rezultatul este împărțit la 10 și se ia restul.
cc = ((cc % 10) * (i % 10)) % 10;
}
// Acum cc = U(i^i).
//cout << "U(" << i << "^" << i << ") = " << cc << endl;
s += cc; // La sumă se adaugă U(i^i).
}
return s % 10;
}
else // Dacă lungimea șirului este mai mare decât 1
{
int c = atoi(x); // Transformăm șirul x în int-ul c.
// În rest algoritmul este la fel ca în cealaltă ramură a structurii
// if, dar fără comentarii.
int s = 0;
for (int i = 1; i <= c; i++) {
int cc = 1;
for (int j = 0; j < i; j++) {
cc = ((cc % 10) * (i % 10)) % 10;
}
s += cc;
}
return s % 10;
}
//return 42; // Valoare implicită, greșită, în locul unui algoritm complet.
}
int main() {
ifstream fin("cifra.in");
ofstream fout("cifra.out");
int T;
fin >> T;
for (int i = 0; i < T; i++) {
char x[102]; // Există 101 cifre în numărul 10^100,
// și în plus există caracterul nul la final.
fin >> x;
int u = cifra(x);
//cout << u << endl;
fout << u << endl;
}
fin.close();
fout.close();
return 0;
}