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