Advertisement
hanelolo

radical simplifier

Apr 4th, 2014
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <string>
  5. #include <windows.h>
  6.  
  7. //Nie udzielam na ten program żadnej gwarancji, używasz go wyłącznie na własne ryzyko.
  8.  
  9. //wersja alpha, niezoptymalizowana; data ostatniej modyfikacji: 16-02-2014 21:53
  10. using namespace std;
  11.  
  12. double bezwzgledna(double wejscie){return ((wejscie<0) ? wejscie*(-1) : wejscie);}
  13.  
  14. double potegowanie(double podstawa, int wykladnik){
  15.     double wynik=1.0;
  16.     bool licz=true;
  17.     bool czy_blad=false;
  18.     bool odwroc_wynik=false;
  19.     if(podstawa==0&&wykladnik==0) {czy_blad=true;licz=false;}
  20.     if(podstawa==0) {wynik=0;licz=false;}
  21.     if(podstawa!=0&&wykladnik==0) {wynik=1;licz=false;}
  22.     if(podstawa!=0&&wykladnik<0) {wykladnik=wykladnik*(-1);odwroc_wynik=true;}
  23.     if(licz==true) {
  24.         for(int i=1;i<=wykladnik;i++) {
  25.             wynik=wynik*podstawa;
  26.         }
  27.         if(odwroc_wynik==true) {wynik=1/wynik;}
  28.     } else {
  29.         if(czy_blad==true) {
  30.             return false;
  31.         }
  32.     }
  33.     return wynik;
  34. }
  35.  
  36. double pierwiastkowanie(int stopien, double wejscie, int precyzja){
  37.     if(stopien<=1) return false;
  38.     if(stopien%2==0&&wejscie<0) return false;
  39.     bool wynik_ze_znakiem=false;
  40.     if(wejscie<0) wynik_ze_znakiem=true;
  41.     int j=0;
  42.     double prec=1;
  43.     double seek=0.0;
  44.     while(1) {
  45.         if(potegowanie(j,stopien)>bezwzgledna(wejscie)) break;
  46.         j+=1;
  47.     }
  48.     j-=1;
  49.     seek=j;
  50.     for(int i=0;i<precyzja;i++){
  51.         prec=prec*0.1;
  52.         while(1){
  53.             seek+=prec;
  54.             if(potegowanie(seek,stopien)>bezwzgledna(wejscie)) break;
  55.         }
  56.         seek-=prec;
  57.     }
  58.     return ((wynik_ze_znakiem==true) ? seek*(-1) : seek);
  59. }
  60.  
  61. //cls routine by MS: http://support.microsoft.com/kb/99261
  62. int cls(void){
  63.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  64.     COORD coordScreen = { 0, 0 };
  65.     DWORD cCharsWritten;
  66.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  67.     DWORD dwConSize;
  68.     GetConsoleScreenBufferInfo( hConsole, &csbi );
  69.     dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  70.     FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten );
  71.     GetConsoleScreenBufferInfo( hConsole, &csbi );
  72.     FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten );
  73.     SetConsoleCursorPosition( hConsole, coordScreen );
  74.     return 0;
  75. }
  76.  
  77. void wymaz_z_tablicy(int* tablica, int element, int wystapien, int rozmiar_tab){
  78.     for(int i=0;i<rozmiar_tab;i++){
  79.         if(wystapien==0) break;
  80.         if(tablica[i]==element) {
  81.             tablica[i]=0;
  82.             wystapien-=1;
  83.         }
  84.     }
  85.     return;
  86. }
  87.  
  88. int main(){
  89.     cout << "\n upraszczacz pierwiastkow arytmetycznych v0.1a\n Copyright (C)2014 Michal Hanebach\n\n ";
  90.     cout << "Ten program jest darmowy. Nie udziela sie nan zadnej gwarancji.\n\n ";
  91.     Sleep(2000);
  92.     cls();
  93.  
  94.     int kolory[32];
  95.     int domyslne_kolory[]={46,48,55,58,62,63,78,79,87,94,110,111,121,126,128,129,132,133,138,139,142,143};
  96.     //int domyslne_kolory[]={2,3,4,5,6,8,2,3,4,5,6,8,2,3,4,5,6,8,2,3,4,5,6,8};
  97.     //int domyslne_kolory[]={10,14,12,11,13,15,10,14,12,11,13,15,10,14,12,11,13,15,10,14,12,11,13,15};
  98.     for(int i=0;i<32;i++){kolory[i]=0;}
  99.     string linia;
  100.     bool domyslne=false;
  101.     ifstream schemat_kolorow;
  102.     schemat_kolorow.open("schemat_kolorow.ini");
  103.     if(schemat_kolorow.is_open()==true) {
  104.         getline(schemat_kolorow,linia);
  105.         schemat_kolorow.close();
  106.         if(linia[0]=='k'&&linia[1]=='o'&&linia[2]=='l'&&linia[3]=='o'&&linia[4]=='r'&&linia[5]=='y'&&linia[6]=='='){
  107.             int i=0;
  108.             int j=7;
  109.             int m=0;
  110.             int bufor[3];
  111.             int tokens=0;
  112.             bool wyjdz=false;
  113.             int zlepiona_liczba=0;
  114.             while(linia[j]!=0){
  115.                 switch(linia[j]){
  116.                     case 44: //ASCII ","
  117.                     for(int k=0;k<3;k++){bufor[k]=0;}
  118.                     tokens+=1;
  119.                     if(tokens>32) wyjdz=true;
  120.                     break;
  121.                    
  122.                     default:
  123.                     while(linia[j]!=',') {bufor[m]=linia[j];j+=1;m+=1;if(m>2) {break;}}
  124.                     j-=1;
  125.                     if(bufor[2]<48||bufor[2]>57) { //ASCII "0" "9"
  126.                         zlepiona_liczba=(bufor[1]%16);
  127.                         zlepiona_liczba+=(bufor[0]%16)*10;
  128.                     } else {
  129.                         zlepiona_liczba=bufor[2]%16;
  130.                         zlepiona_liczba+=(bufor[1]%16)*10;
  131.                         zlepiona_liczba+=(bufor[0]%16)*100;
  132.                     }
  133.                     kolory[i]=zlepiona_liczba;
  134.                     i+=1;
  135.                     m=0;
  136.                     break;
  137.                 }
  138.                 if(wyjdz==true) {break;}
  139.                 j+=1;
  140.             }
  141.         }
  142.     } else {domyslne=true;}
  143.     if(domyslne) {copy(domyslne_kolory,domyslne_kolory+26,kolory);}
  144.     do {
  145.     //for(int i=0;i<32;i++){if(kolory[i]!=0){cout << " " << kolory[i];}}
  146.     HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
  147.     /*for(int i=0;i<32;i++){
  148.         if(kolory[i]==0) break;
  149.         cout << "\n";
  150.         SetConsoleTextAttribute(hConsole,kolory[i]);
  151.         for(int j=0;j<5;j++){cout << kolory[i];}
  152.     }*/
  153.     //SetConsoleTextAttribute(hConsole,7);
  154.    
  155.     int ilosc=0;
  156.     for(int i=0;i<32;i++){if(kolory[i]!=0) {ilosc+=1;}}
  157.     srand(time(NULL));
  158.     int losowe[ilosc];
  159.     int los=0;
  160.     int ilosc_wystapien=0;
  161.     int ilosc_zapisanych=-1;
  162.     for(;ilosc_zapisanych<ilosc-1;){
  163.         los=rand() % ilosc;
  164.         ilosc_wystapien=0;
  165.         for(int j=0;j<ilosc;j++) {
  166.             if(losowe[j]==los) {ilosc_wystapien+=1;}
  167.         }
  168.         if(ilosc_wystapien!=0) continue;
  169.         ilosc_zapisanych+=1;
  170.         losowe[ilosc_zapisanych]=los;
  171.     }
  172.     long int liczba=0;
  173.     int stopien=0;
  174.     cout << "\n Podaj liczbe podpierwiastkowa: ";
  175.     cin >> liczba;
  176.     cout << "\n Podaj stopien pierwiastka: ";
  177.     cin >> stopien;
  178.     if(liczba<0&&stopien%2==0){
  179.         SetConsoleTextAttribute(hConsole,12);
  180.         cout << "\n  Program nie obsluguje jednostki urojonej.\n";
  181.         SetConsoleTextAttribute(hConsole,7);
  182.         continue;
  183.     }
  184.     bool ze_znakiem=false;
  185.     if(liczba<0) {
  186.         SetConsoleTextAttribute(hConsole,14);
  187.         cout << "\n  Do rozkladu zmieniono znak liczby na przeciwny.";
  188.         SetConsoleTextAttribute(hConsole,7);
  189.         ze_znakiem=true;
  190.         liczba*=(-1);
  191.     }
  192.     int pierwsze[100];
  193.     int ilosci_dzielnikow[100];
  194.     int wylaczone_przed_pierwiastek[100];
  195.     int ilosc_do_wymazania[100];
  196.     int unikatowe_dzielniki[100];
  197.     for(int i=0;i<100;i++){
  198.         pierwsze[i]=0;
  199.         ilosci_dzielnikow[i]=0;
  200.         wylaczone_przed_pierwiastek[i]=0;
  201.         ilosc_do_wymazania[i]=0;
  202.         unikatowe_dzielniki[i]=0;
  203.     }
  204.     int indeks_ilosci_dzielnikow=0;
  205.     int powtorzen_dzielnika=0;
  206.     int ostatni_dzielnik=1;
  207.     long int liczba_=liczba;
  208.     int i=0;
  209.     for(;;){
  210.         powtorzen_dzielnika=0;
  211.         ostatni_dzielnik+=1;
  212.         while(liczba_%ostatni_dzielnik==0) {
  213.             powtorzen_dzielnika+=1;
  214.             pierwsze[i]=ostatni_dzielnik;
  215.             i+=1;
  216.             liczba_/=ostatni_dzielnik;
  217.         }
  218.         if(powtorzen_dzielnika!=0) {
  219.             ilosci_dzielnikow[indeks_ilosci_dzielnikow]=powtorzen_dzielnika;
  220.             indeks_ilosci_dzielnikow+=1;
  221.         }
  222.         if(ostatni_dzielnik==liczba) break;
  223.     }
  224.     int indeks_koloru=0;
  225.     ostatni_dzielnik=0;
  226.     int indeks_do_wymazania=0;
  227.     int indeks_wylaczonych=0;
  228.     cout << "\n\n  Rozklad liczby " << liczba << " na czynniki pierwsze:\n\n  ";
  229.     for(int i=0;i<99;i++){
  230.         if(pierwsze[i]!=ostatni_dzielnik) {indeks_koloru+=1;}
  231.         if(pierwsze[i]!=0) {
  232.             SetConsoleTextAttribute(hConsole,kolory[indeks_koloru]);
  233.             cout << pierwsze[i];
  234.             SetConsoleTextAttribute(hConsole,7);
  235.         }
  236.         if(pierwsze[i+1]!=0) {cout << " * ";}
  237.     }
  238.     cout << "\n\n  Rozklad na iloczyn potegowy:\n\n  ";
  239.     bool pierwsza_iteracja=true;
  240.     indeks_koloru=0;
  241.     ostatni_dzielnik=0;
  242.     indeks_ilosci_dzielnikow=0;
  243.     int pomocnicza1=0;
  244.     int pomocnicza2=0;
  245.     for(int i=0;i<99;i++){
  246.         if(pierwsze[i]==ostatni_dzielnik) continue;
  247.         if(pierwsze[i]==0&&pierwsze[i+1]==0) break;
  248.         pomocnicza1=ilosci_dzielnikow[indeks_ilosci_dzielnikow];
  249.         pomocnicza2=0;
  250.         if(pierwsza_iteracja==false) {cout << " * ";}
  251.         pierwsza_iteracja=false;
  252.         SetConsoleTextAttribute(hConsole,kolory[indeks_koloru]);
  253.         cout << pierwsze[i];
  254.         if(ilosci_dzielnikow[indeks_ilosci_dzielnikow]>1) {
  255.             cout << "^" << ilosci_dzielnikow[indeks_ilosci_dzielnikow];
  256.         }
  257.         SetConsoleTextAttribute(hConsole,7);
  258.         indeks_koloru+=1;
  259.         if(ilosci_dzielnikow[indeks_ilosci_dzielnikow]>=stopien) {
  260.             while(pomocnicza1>=stopien) {pomocnicza1-=stopien;pomocnicza2+=1;}
  261.             for(int j=0;j<pomocnicza2;j++){
  262.                 wylaczone_przed_pierwiastek[indeks_wylaczonych]=pierwsze[i];
  263.                 indeks_wylaczonych+=1; 
  264.             }
  265.             ilosc_do_wymazania[indeks_do_wymazania]=pomocnicza2*stopien;
  266.             indeks_do_wymazania+=1;
  267.         }
  268.         indeks_ilosci_dzielnikow+=1;
  269.         ostatni_dzielnik=pierwsze[i];
  270.     }
  271.     bool cos_wylaczone=false;
  272.     for(int i=0;i<100;i++){if(wylaczone_przed_pierwiastek[i]!=0) {cos_wylaczone=true;}}
  273.    
  274.     if(cos_wylaczone) {
  275.         ostatni_dzielnik=1;
  276.         indeks_do_wymazania=0;
  277.         for(int i=0;i<99;i++){
  278.             if(pierwsze[i]==0&&pierwsze[i+1]==0) break;
  279.             if(pierwsze[i]==ostatni_dzielnik) continue;
  280.             unikatowe_dzielniki[indeks_do_wymazania]=pierwsze[i];
  281.             indeks_do_wymazania+=1;
  282.             ostatni_dzielnik=pierwsze[i];
  283.         }
  284.        
  285.         for(int i=0;i<99;i++){
  286.             if(unikatowe_dzielniki[i]==0&&unikatowe_dzielniki[i+1]==0) break;
  287.             wymaz_z_tablicy(pierwsze,unikatowe_dzielniki[i],ilosc_do_wymazania[i],100);
  288.         }
  289.        
  290.         int liczba_podpierwiastkowa=1;
  291.         int liczba_przedpierwiastkowa=1;
  292.         for(int i=0;i<100;i++){
  293.             if(pierwsze[i]!=0) {liczba_podpierwiastkowa*=pierwsze[i];}
  294.             if(wylaczone_przed_pierwiastek[i]!=0) {liczba_przedpierwiastkowa*=wylaczone_przed_pierwiastek[i];}
  295.         }
  296.        
  297.         SetConsoleTextAttribute(hConsole,15);
  298.         cout << "\n\n  " << ((ze_znakiem==true) ? -liczba_przedpierwiastkowa : liczba_przedpierwiastkowa);
  299.         if(liczba_podpierwiastkowa!=1) {
  300.             cout << " pierwiastkow ";
  301.             switch(stopien){
  302.                 case 2:
  303.                 cout << "kwadratowych";
  304.                 break;
  305.                
  306.                 case 3:
  307.                 cout << "szesciennych";
  308.                 break;
  309.                
  310.                 default:
  311.                 cout << stopien << ". stopnia";
  312.             }
  313.             cout << " z " << liczba_podpierwiastkowa;
  314.         }
  315.         SetConsoleTextAttribute(hConsole,7);
  316.     } else {
  317.         SetConsoleTextAttribute(hConsole,14);
  318.         cout << "\n\n  Pierwiastek z podanej liczby o zadanym stopniu jest nieupraszczalny.\n";
  319.         SetConsoleTextAttribute(hConsole,7);
  320.     }
  321.     if(ze_znakiem) {liczba*=(-1);}
  322.     cout << "\n\n  Wartosc przyblizona podanego pierwiastka: " << setprecision(10) << pierwiastkowanie(stopien,liczba,10);
  323.     cout << "\n\n";
  324.     } while(0==0);
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement