Cod sursa(job #1799108)

Utilizator silviuboganSilviu Bogan silviubogan Data 5 noiembrie 2016 19:39:05
Problema Cifra Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
// 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;
}