Cod sursa(job #1799111)

Utilizator silviuboganSilviu Bogan silviubogan Data 5 noiembrie 2016 19:42:00
Problema Cifra Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
// 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 = atoi(x); // 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;
	
	for (int i = 0; i < T; i++) {
		char x[102]; // Exista 101 cifre in numarul 10^100,
					 // si in plus exista caracterul nul la final.
		fin >> x;
		int u = cifra(x);
		//cout << u << endl;
		fout << u << endl;
	}

	fin.close();
	fout.close();

	return 0;
}