Pagini recente » Cod sursa (job #776345) | Profil donantonio1 | Cod sursa (job #2156095) | Cod sursa (job #172271) | Cod sursa (job #1799124)
// O rezolvare de catre 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); // Obtinem lungimea sirului de caractere.
if (l == 1) { // Daca lungimea este 1, tratam sirul in mod special.
int c = x[0] - '0'; // Transformam unicul caracter din sir in cifra.
int s = 0; // Facem o variabila pt. suma finala.
// Pentru fiecare cifra din baza 10 de la 1 pana la unica cifra din sir.
for (int i = 1; i <= c; i++) {
// i este cifra curenta.
// Calculam U(i^i).
int cc = 1; // cc va retine U(i^i).
for (int j = 0; j < i; j++) {
// Ultima cifra a copiei este inmultita cu ultima cifra a
// cifrei curente si rezultatul este impartit la 10 si se ia restul.
cc = ((cc % 10) * (i % 10)) % 10;
}
// Acum cc = U(i^i).
//cout << "U(" << i << "^" << i << ") = " << cc << endl;
s += cc; // La suma se adauga U(i^i).
}
return s % 10;
}
else // Daca lungimea sirului este mai mare decat 1
{
int c = (x[l-2] - '0') * 10 + (x[l-1] - '0'); // Transformam sirul x in int-ul c.
// in rest algoritmul este la fel ca in cealalta ramura a structurii
// if, dar fara 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 implicita, gresita, in locul unui algoritm complet.
}
int main() {
ifstream fin("cifra.in");
ofstream fout("cifra.out");
int T;
fin >> T;
char x[102]; // Exista 101 cifre in numarul 10^100,
// si in plus exista caracterul nul la final.
for (int i = 0; i < T; i++) {
fin >> x;
int u = cifra(x);
//cout << u << endl;
fout << u << endl;
}
fin.close();
fout.close();
return 0;
}