Rozkład liczby n! - bug w kodzie

0

Program polega na mnożenu kolejnych liczb 2, 3, 4, 5, ..., n do uzyskania iloczynu najbliższego wartosci MAX. Taki iloczyn wpisuje do tablicy T i mnoży dalej. Przykład:

n==13
11! ląduje w T[0]
12*13 w T[1]

dla n >=31 mam błędne wyniki. Dwa iloczyny wypisane na końcu (pierwszy: iloczyn wartosci z tablicy, drugi to zwyczajnie n!) powinny sie zgadzac. Nie zgadzają sie i nie potrafie znaleźć w tym błędu.

#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#define MAX 477218588
#define POKAZ(x) cout<<#x<<": "<<x<<endl;
using namespace std;

unsigned int *Binary_Opt (unsigned int n)
{
  unsigned int i, j, tmp = 1;
  unsigned int *T = new unsigned int [n/2+1] {};

  for(i = 2, j = 0; i<=n; ++i)
  {
    if(tmp*i>MAX)
    {
      T[j++] = tmp;
      tmp = 1;
      --i;
    }
    else
      tmp *= i;
  }
  T[j] = tmp;

  POKAZ(i); POKAZ(n); POKAZ(tmp);
  cout<<"\n\n\n";

  for(j = 0; j < n; ++j)
    cout<<T[j]<<' ';
  cout<<endl;

  long double suma = 1;
  for(j = 0; T[j]; ++j)
    suma *= T[j];
  cout<<suma<<endl;

  for(i = 2, suma = 1; i<=n; ++i)
    suma *= i;
  cout<<suma<<endl;

  cout<<"z "<<n<<" mnozen, zrobilo sie "<<j<<endl;

  return T;
}

int main()
{
  unsigned int n;
  cin >> n;
  Binary_Opt(n);
  return 0;
}
2

Jedno z:
1.

if(tmp*i<tmp) // if(tmp*i>MAX)
if(1.*tmp*i>MAX) // if(tmp*i>MAX)
0

To pierwsze nie działa, drugie natomiast owszem. Jednak chyba nie do końca rozumiem ten zapis i to, z czego wynikał błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1