SHARE
TWEET

radical simplifier

hanelolo Apr 4th, 2014 25 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
Top