Advertisement
MrChrHD

Random thing with numbers

Dec 12th, 2020
961
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <boost/rational.hpp>
  4. using namespace std;
  5.  
  6. // Functions
  7. vector<boost::rational<int64_t>> findCombinations(int number);
  8. vector<boost::rational<int64_t>> removeDuplicates(vector<boost::rational<int64_t>> fractionArray);
  9. vector<boost::rational<int64_t>> addNegatives(vector<boost::rational<int64_t>> fractionArray);
  10.  
  11. int main() {
  12.     bool limitResults = false;
  13.  
  14.     cout << "Corrisponenza biunivoca dei primi 1001 numeri degli insiemi N ed R" << endl;
  15.  
  16.     vector<boost::rational<int64_t>> temp;
  17.     vector<boost::rational<int64_t>> frazioni;
  18.     vector<boost::rational<int64_t>> frazioniNegative;
  19.  
  20.     // Il valore dell'indice del ciclo (i) rappresenta il numero in N da trovare
  21.     // Trovo tutte le combinazioni valide dei numeri
  22.     cout << "Trovo tutte le combinazioni e le scrivo in frazioni..." << endl;
  23.     for(int i = 1; i < 500; i++) {
  24.         temp = findCombinations(i);
  25.         for(int j = 0; j < temp.size(); j++) {
  26.             frazioni.push_back(temp[j]);
  27.         }
  28.     }
  29.  
  30.     // Rimuovo i duplicati
  31.     cout << "Rimuovo i duplicati..." << endl;
  32.     frazioni = removeDuplicates(frazioni);
  33.  
  34.     // Ottengo i numeri negativi (positivi hanno il loro rispettivo negativo allo stesso indice)
  35.     cout << "Aggiungo gli opposti..." << endl;
  36.     frazioniNegative = addNegatives(frazioni);
  37.  
  38.     // Stampo i risultati
  39.     // Inizio dalla prima riga
  40.     cout << "Stampo i risultati..." << endl;
  41.     cout << "N" << "       " <<  "Q" << endl << "1" << "       " << "0" << endl;
  42.  
  43.     // Gli altri - Nota: il numero di elementi di entrambi i vector e' sempre uguale
  44.     int lastIndex = 1; // Numero N da stampare
  45.  
  46.     for(int i = 1; i < frazioni.size(); i++) {
  47.  
  48.         if(lastIndex > 999 && limitResults) {
  49.             // Do nothing
  50.         } else {
  51.             if(frazioni[i].numerator() == 0) {
  52.                 // Salta, il numero corrisponde a 0
  53.             } else if (frazioni[i].denominator() == 1) { // Se ha denominatore 1 stampa diretto il numeratore
  54.                 lastIndex = lastIndex + 1;
  55.                 cout << lastIndex << "       " << frazioni[i].numerator() << endl;
  56.             } else { // Altrimenti stampa quello che si trova in quella posizione
  57.                 lastIndex = lastIndex + 1;
  58.                 cout << lastIndex << "       " << frazioni[i] << endl;
  59.             }
  60.  
  61.             if(frazioniNegative[i].numerator() == 0) {
  62.                 // Salta, il numero corrisponde a 0
  63.             } else if (frazioniNegative[i].denominator() == 1) { // Se ha denominatore 1 stampa diretto il numeratore
  64.                 lastIndex = lastIndex + 1;
  65.                 cout << lastIndex << "       " << frazioniNegative[i].numerator() << endl;
  66.             } else { // Altrimenti stampa quello che si trova in quella posizione
  67.                 lastIndex = lastIndex + 1;
  68.                 cout << lastIndex << "       " << frazioniNegative[i] << endl;
  69.             }
  70.         }
  71.     }
  72.  
  73.     cout << "Terminato." << endl << "Premere invio per uscire" << endl;
  74.     getchar();
  75.     return 0;
  76. }
  77.  
  78. vector<boost::rational<int64_t>> findCombinations(int number) {
  79.     vector<boost::rational<int64_t>> temp;
  80.     int tnum = number;
  81.     int tden = 0;
  82.  
  83.     // Il primo caso (number, 0) va escluso in quanto sempre impossibile
  84.     int i = 0;
  85.     while(tden < number) {
  86.         tnum--;
  87.         tden++;
  88.  
  89.         // Converto in frazione
  90.         boost::rational<int64_t> fraction(tnum, tden);
  91.  
  92.         // Aggiungo all'array
  93.         temp.push_back(fraction);
  94.         i++;
  95.     }
  96.  
  97.     return temp;
  98. }
  99.  
  100. vector<boost::rational<int64_t>> removeDuplicates(vector<boost::rational<int64_t>> fractionArray) {
  101.     // Copio l'array per evitare rogne
  102.     vector<boost::rational<int64_t>> temp = fractionArray;
  103.  
  104.     // Elimino i duplicati
  105.     temp.erase(unique(temp.begin(), temp.end()),temp.end());
  106.  
  107.     // Seconda eliminazione (a volte erase non funziona bene)
  108.     for(int i = 0; i < temp.size(); i++) {
  109.         boost::rational<int64_t> check = temp[i];
  110.  
  111.         bool isFirstCheck = true;
  112.         for(int j = 0; j < temp.size(); j++) {
  113.             if(temp[j] == check && !isFirstCheck) {
  114.                 temp.erase(temp.begin() + j);
  115.             } else if (temp[j] == check && isFirstCheck) {
  116.                 isFirstCheck = false;
  117.             }
  118.         }
  119.     }
  120.  
  121.     return temp;
  122. }
  123.  
  124. vector<boost::rational<int64_t>> addNegatives(vector<boost::rational<int64_t>> fractionArray) {
  125.     vector<boost::rational<int64_t>> temp;
  126.  
  127.     for(int i = 0; i < fractionArray.size(); i++) {
  128.         temp.push_back(-fractionArray[i]);
  129.     }
  130.  
  131.     temp = removeDuplicates(temp);
  132.  
  133.     return temp;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement