#include <stdio.h> #include <math.h> char wyrazenie[1000]; int znak; void wyra_suma(int czynnik); int rozbior(int n); int main() { int t; //ilość liczb 1-100 int n; //kolejna liczba 1-10^9 (void)scanf("%d", &t); while(t--) //testuj kolejne liczby { (void)scanf("%d", &n); if(n==1) { printf("1\n"); continue; } znak = 0; //inicjacja stringa wyrazenia if( rozbior(n)<=100 ) { wyrazenie[znak++] = '\0'; printf("%s\n", wyrazenie); } else { printf("NIE\n"); } } //test kolejnej liczby return 0; } int rozbior(int n) { int k = 2; //kolejne dzielniki int sum = 0; //ilość jedynek int pierw = sqrt(n); //pierwiastek z testowanej liczby int czynniki[30]; //czynniki pierwsze liczby int ilczyn = 0; //ilość czynników pierwszych while( n>1 && k<=pierw ) { while(n%k==0) //dopóki liczba jest podzielna przez k { czynniki[ilczyn++] = k; n /= k; } ++k; } if( n>1 ) { czynniki[ilczyn++] = n; } //czynniki większe od 5 można dalej rozebrać z korzyscią dla ilości jedynek while(ilczyn--) { if(czynniki[ilczyn] <= 5) { wyra_suma(czynniki[ilczyn]); sum += czynniki[ilczyn]; } else { wyrazenie[znak++] = '('; wyrazenie[znak++] = '1'; wyrazenie[znak++] = '+'; sum++; sum += rozbior(czynniki[ilczyn]-1); wyrazenie[znak++] = ')'; } if(ilczyn) wyrazenie[znak++] = '*'; } return sum; } void wyra_suma(int czynnik) { wyrazenie[znak++] = '('; while(czynnik--) { wyrazenie[znak++] = '1'; if(czynnik) wyrazenie[znak++] = '+'; } wyrazenie[znak++] = ')'; }
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 <stdio.h> #include <math.h> char wyrazenie[1000]; int znak; void wyra_suma(int czynnik); int rozbior(int n); int main() { int t; //ilość liczb 1-100 int n; //kolejna liczba 1-10^9 (void)scanf("%d", &t); while(t--) //testuj kolejne liczby { (void)scanf("%d", &n); if(n==1) { printf("1\n"); continue; } znak = 0; //inicjacja stringa wyrazenia if( rozbior(n)<=100 ) { wyrazenie[znak++] = '\0'; printf("%s\n", wyrazenie); } else { printf("NIE\n"); } } //test kolejnej liczby return 0; } int rozbior(int n) { int k = 2; //kolejne dzielniki int sum = 0; //ilość jedynek int pierw = sqrt(n); //pierwiastek z testowanej liczby int czynniki[30]; //czynniki pierwsze liczby int ilczyn = 0; //ilość czynników pierwszych while( n>1 && k<=pierw ) { while(n%k==0) //dopóki liczba jest podzielna przez k { czynniki[ilczyn++] = k; n /= k; } ++k; } if( n>1 ) { czynniki[ilczyn++] = n; } //czynniki większe od 5 można dalej rozebrać z korzyscią dla ilości jedynek while(ilczyn--) { if(czynniki[ilczyn] <= 5) { wyra_suma(czynniki[ilczyn]); sum += czynniki[ilczyn]; } else { wyrazenie[znak++] = '('; wyrazenie[znak++] = '1'; wyrazenie[znak++] = '+'; sum++; sum += rozbior(czynniki[ilczyn]-1); wyrazenie[znak++] = ')'; } if(ilczyn) wyrazenie[znak++] = '*'; } return sum; } void wyra_suma(int czynnik) { wyrazenie[znak++] = '('; while(czynnik--) { wyrazenie[znak++] = '1'; if(czynnik) wyrazenie[znak++] = '+'; } wyrazenie[znak++] = ')'; } |