Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <boost/rational.hpp>
- using namespace std;
- // Functions
- vector<boost::rational<int64_t>> findCombinations(int number);
- vector<boost::rational<int64_t>> removeDuplicates(vector<boost::rational<int64_t>> fractionArray);
- vector<boost::rational<int64_t>> addNegatives(vector<boost::rational<int64_t>> fractionArray);
- int main() {
- bool limitResults = false;
- cout << "Corrisponenza biunivoca dei primi 1001 numeri degli insiemi N ed R" << endl;
- vector<boost::rational<int64_t>> temp;
- vector<boost::rational<int64_t>> frazioni;
- vector<boost::rational<int64_t>> frazioniNegative;
- // Il valore dell'indice del ciclo (i) rappresenta il numero in N da trovare
- // Trovo tutte le combinazioni valide dei numeri
- cout << "Trovo tutte le combinazioni e le scrivo in frazioni..." << endl;
- for(int i = 1; i < 500; i++) {
- temp = findCombinations(i);
- for(int j = 0; j < temp.size(); j++) {
- frazioni.push_back(temp[j]);
- }
- }
- // Rimuovo i duplicati
- cout << "Rimuovo i duplicati..." << endl;
- frazioni = removeDuplicates(frazioni);
- // Ottengo i numeri negativi (positivi hanno il loro rispettivo negativo allo stesso indice)
- cout << "Aggiungo gli opposti..." << endl;
- frazioniNegative = addNegatives(frazioni);
- // Stampo i risultati
- // Inizio dalla prima riga
- cout << "Stampo i risultati..." << endl;
- cout << "N" << " " << "Q" << endl << "1" << " " << "0" << endl;
- // Gli altri - Nota: il numero di elementi di entrambi i vector e' sempre uguale
- int lastIndex = 1; // Numero N da stampare
- for(int i = 1; i < frazioni.size(); i++) {
- if(lastIndex > 999 && limitResults) {
- // Do nothing
- } else {
- if(frazioni[i].numerator() == 0) {
- // Salta, il numero corrisponde a 0
- } else if (frazioni[i].denominator() == 1) { // Se ha denominatore 1 stampa diretto il numeratore
- lastIndex = lastIndex + 1;
- cout << lastIndex << " " << frazioni[i].numerator() << endl;
- } else { // Altrimenti stampa quello che si trova in quella posizione
- lastIndex = lastIndex + 1;
- cout << lastIndex << " " << frazioni[i] << endl;
- }
- if(frazioniNegative[i].numerator() == 0) {
- // Salta, il numero corrisponde a 0
- } else if (frazioniNegative[i].denominator() == 1) { // Se ha denominatore 1 stampa diretto il numeratore
- lastIndex = lastIndex + 1;
- cout << lastIndex << " " << frazioniNegative[i].numerator() << endl;
- } else { // Altrimenti stampa quello che si trova in quella posizione
- lastIndex = lastIndex + 1;
- cout << lastIndex << " " << frazioniNegative[i] << endl;
- }
- }
- }
- cout << "Terminato." << endl << "Premere invio per uscire" << endl;
- getchar();
- return 0;
- }
- vector<boost::rational<int64_t>> findCombinations(int number) {
- vector<boost::rational<int64_t>> temp;
- int tnum = number;
- int tden = 0;
- // Il primo caso (number, 0) va escluso in quanto sempre impossibile
- int i = 0;
- while(tden < number) {
- tnum--;
- tden++;
- // Converto in frazione
- boost::rational<int64_t> fraction(tnum, tden);
- // Aggiungo all'array
- temp.push_back(fraction);
- i++;
- }
- return temp;
- }
- vector<boost::rational<int64_t>> removeDuplicates(vector<boost::rational<int64_t>> fractionArray) {
- // Copio l'array per evitare rogne
- vector<boost::rational<int64_t>> temp = fractionArray;
- // Elimino i duplicati
- temp.erase(unique(temp.begin(), temp.end()),temp.end());
- // Seconda eliminazione (a volte erase non funziona bene)
- for(int i = 0; i < temp.size(); i++) {
- boost::rational<int64_t> check = temp[i];
- bool isFirstCheck = true;
- for(int j = 0; j < temp.size(); j++) {
- if(temp[j] == check && !isFirstCheck) {
- temp.erase(temp.begin() + j);
- } else if (temp[j] == check && isFirstCheck) {
- isFirstCheck = false;
- }
- }
- }
- return temp;
- }
- vector<boost::rational<int64_t>> addNegatives(vector<boost::rational<int64_t>> fractionArray) {
- vector<boost::rational<int64_t>> temp;
- for(int i = 0; i < fractionArray.size(); i++) {
- temp.push_back(-fractionArray[i]);
- }
- temp = removeDuplicates(temp);
- return temp;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement