#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; } |
English