Cod sursa(job #581764)

Utilizator EvilOGLSzabolcs EvilOGL Data 14 aprilie 2011 16:01:33
Problema Numere 2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>

class big {
	int size;
	char digits[100];
public:
	big() {
		digits[0] = 0;
		size = 1;
	}
	bool notone() {
		if (size != 1) {
			return(1);
		}
		return(digits[0] != 1);
	}
	void operator = (char * value) {
		size = strlen(value);
		for (int i = 0; i < size; ++i) {
			digits[i] = value[i] - '0';
		}
	}
	void operator /= (int value) {
		char old[100];
		int last = size;
		int current = 0;
		int temporary = 0;

		size = 0;
		memcpy(&old, &digits, 100);
		while (temporary < value) {
			temporary = temporary * 10 + old[current++];
			if (current == last) {
				if (temporary < value) {
					digits[size++] = 0;
					return;
				}
			}
		}
		digits[size++] = (char)(temporary / value);
		temporary %= value;
		while (current < last) {
			temporary = temporary * 10 + old[current++];
			digits[size++] = (char)(temporary / value);
			temporary %= value;
		}
	}
	int operator % (int value) {
		int current = 0;
		int temporary = 0;
		while (temporary < value) {
			temporary = temporary * 10 + digits[current++];
			if (current == size) {
				return(temporary % value);
			}
		}
		temporary %= value;
		while (current < size) {
			temporary = temporary * 10 + digits[current++];
			temporary %= value;
		}
		return(temporary);
	}
	void print() {
		for (int i = 0; i < size; ++i) {
			printf("%hhd", digits[i]);
		}
	}
};

void test(big num, int div) {
	int power = 0;
	while (num.notone()) {
		if (num % div != 0) {
			return;
		}
		num /= div;
		++power;
	}
	FILE * fout = fopen("numere2.out", "wt");
	fprintf(fout, "%d\n%d\n", div, power);
	fclose(fout);
	exit(0);
}

char loadnum[100];
big number;

int main() {
	char * readnum = loadnum;
	FILE * fin = fopen("numere2.in", "rt");
	fscanf(fin, "%s", readnum);
	number = readnum;
	fclose(fin);
	
	FILE * fout = fopen("numere2.out", "wt");
	fprintf(fout, "%s\n1\n", readnum);
	fclose(fout);
	
	int add = (int)(number % 2 != 0) + 1;
	int div = add + 1;
	while (1) {
		if (number % div == 0) {
			test(number, div);
		}
		div += add;
	}
}