fork(1) download
  1. #include <iostream>
  2. #include <iterator>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. vector < pair <unsigned, unsigned> > dividers(unsigned n)
  10. {
  11. vector < pair <unsigned, unsigned> > res;
  12.  
  13. if (n <= 1)
  14. res.push_back(make_pair(n, 1));
  15.  
  16. for (unsigned q=2; q*q<=n; ++q)
  17. {
  18. if (n % q == 0)
  19. {
  20. unsigned d;
  21. for (d=0; !(n%q); ++d) n/=q;
  22. res.push_back(make_pair(q, d));
  23. }
  24. }
  25.  
  26. if (n > 1)
  27. res.push_back(make_pair(n, 1));
  28.  
  29. return res;
  30. }
  31.  
  32. string fragment(const pair <unsigned, unsigned> &p)
  33. {
  34. char res[256];
  35. sprintf(res, p.second==1 ? "%d" : "%d^%d", p.first, p.second);
  36. return res;
  37. }
  38.  
  39. void print(const vector < pair <unsigned, unsigned> > &v)
  40. {
  41. transform(v.begin(), --v.end(), ostream_iterator<string>(cout, " * "), fragment);
  42. cout << fragment(*v.rbegin()) << endl;
  43. }
  44.  
  45. int main()
  46. {
  47. print(dividers(126));
  48. print(dividers(1));
  49. print(dividers(17));
  50. print(dividers(128));
  51. print(dividers(0));
  52. print(dividers(121));
  53.  
  54. return 0;
  55. }
Success #stdin #stdout 0s 4532KB
stdin
Standard input is empty
stdout
2 * 3^2 * 7
1
17
2^7
0
11^2