#include<iostream> #include<cmath> using namespace std; int podzielnik[100]; int ile_dzieln; string wynik; void zamien_na1(int dozamianyna1) { //czynniki mniejsze od 7 zamienia na zestawy jedynek switch (dozamianyna1) { case 2: wynik=wynik+"(1+1)"; break; case 3: wynik=wynik+"(1+1+1)"; break; case 4: wynik=wynik+"(1+1+1+1)"; break; case 5: wynik=wynik+"(1+1+1+1+1)"; break; case 6: wynik=wynik+"(1+1)*(1+1+1)"; break; case 7: wynik=wynik+"((1+1)*(1+1+1)+1)"; break; } } void dzielniki(int n) { //liczbe rozbija na dzielniki int pierw, pom; pierw = sqrt(n); int k=2; //ustawiamy k na pierwsza liczb� pierwsz� //rozklad liczby na czynniki pierwsze while(n>1&&k<=pierw) { while(n%k==0) //dopoki liczba jest podzielna przez k { //jezeli czynnik mniejszy niz 7, wywolywana funkcja zamien na jedynki //jesli nie, wypisujemy (1+ i wywolujemy rekurencyjnie dzielniki(k-1) if (k<=7) zamien_na1(k); else { wynik=wynik+"(1+"; dzielniki(k-1); wynik=wynik+")"; //wynik zapisywany do stringa wynik } n/=k; } ++k; } if(n>7) {//podobnie postepujemy z najwiekszym,ostatnim czynnikiem pierwszym //tez rozbijamy go na (1+reszta. Reszt� (n-1) traktujemy rekurencyjnie dzielniki(n-1) wynik=wynik+"(1+"; dzielniki(n-1); wynik=wynik+")"; } else zamien_na1(n); } int main (void) { ios_base::sync_with_stdio(0); int ile_testow; cin>>ile_testow; for (int licz_testy=1;licz_testy<=ile_testow;licz_testy++) { int liczba=0; cin>>liczba; dzielniki(liczba); int zlicz1=0; for (int licz=0;licz<=wynik.length();licz++) if (wynik[licz]=='1') zlicz1++; if (zlicz1>100) cout<<"NIE\n"; else { for (int licz=0;licz<=wynik.length()-1;licz++) { if ((wynik[licz]==')') && (wynik[licz+1]=='(')) cout<<wynik[licz]<<'*'; else cout<<wynik[licz];} } cout<<'\n'; wynik.clear(); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include<iostream> #include<cmath> using namespace std; int podzielnik[100]; int ile_dzieln; string wynik; void zamien_na1(int dozamianyna1) { //czynniki mniejsze od 7 zamienia na zestawy jedynek switch (dozamianyna1) { case 2: wynik=wynik+"(1+1)"; break; case 3: wynik=wynik+"(1+1+1)"; break; case 4: wynik=wynik+"(1+1+1+1)"; break; case 5: wynik=wynik+"(1+1+1+1+1)"; break; case 6: wynik=wynik+"(1+1)*(1+1+1)"; break; case 7: wynik=wynik+"((1+1)*(1+1+1)+1)"; break; } } void dzielniki(int n) { //liczbe rozbija na dzielniki int pierw, pom; pierw = sqrt(n); int k=2; //ustawiamy k na pierwsza liczb� pierwsz� //rozklad liczby na czynniki pierwsze while(n>1&&k<=pierw) { while(n%k==0) //dopoki liczba jest podzielna przez k { //jezeli czynnik mniejszy niz 7, wywolywana funkcja zamien na jedynki //jesli nie, wypisujemy (1+ i wywolujemy rekurencyjnie dzielniki(k-1) if (k<=7) zamien_na1(k); else { wynik=wynik+"(1+"; dzielniki(k-1); wynik=wynik+")"; //wynik zapisywany do stringa wynik } n/=k; } ++k; } if(n>7) {//podobnie postepujemy z najwiekszym,ostatnim czynnikiem pierwszym //tez rozbijamy go na (1+reszta. Reszt� (n-1) traktujemy rekurencyjnie dzielniki(n-1) wynik=wynik+"(1+"; dzielniki(n-1); wynik=wynik+")"; } else zamien_na1(n); } int main (void) { ios_base::sync_with_stdio(0); int ile_testow; cin>>ile_testow; for (int licz_testy=1;licz_testy<=ile_testow;licz_testy++) { int liczba=0; cin>>liczba; dzielniki(liczba); int zlicz1=0; for (int licz=0;licz<=wynik.length();licz++) if (wynik[licz]=='1') zlicz1++; if (zlicz1>100) cout<<"NIE\n"; else { for (int licz=0;licz<=wynik.length()-1;licz++) { if ((wynik[licz]==')') && (wynik[licz+1]=='(')) cout<<wynik[licz]<<'*'; else cout<<wynik[licz];} } cout<<'\n'; wynik.clear(); } return 0; } |