Факториал — Массив — C++

Задача состоит в том, чтобы вычислить факториал числа. Я отладил свой код, и он отлично работает для любых входных данных и выдает правильный вывод для всех заданных тестовых случаев. Но тем не менее, я получаю неверный ответ на SPOJ.

Проблема:

Целое число t, 1‹=t‹=100, обозначающее количество наборов тестов, за которым следуют t строк, каждая из которых содержит одно целое число n, 1‹=n‹=100.

Любое понимание будет полезно. Я пропустил некоторые критические тестовые случаи?

Мой код:

#include <iostream>
using namespace std;
int main()
{

long T;
cin>>T;
while(T--)
{
    long long N;

    long long index, count;
    cin>>N;
    long long a[300];
    long long i=1;
    a[0]=1; count=1;
    while(i<=N)
    {

        long long z=0;
        long long k; long long x;
        long long j=i;
        long long temp=0; long long current=0;
        for(k=0; k<count;k++)
        {
            x=(a[k]*j)+temp;
            a[k]=x%10;
            temp=x/10;
        }
        if(temp>0)
            while(temp>0)
            {
                a[k]=temp;
                temp=temp/10;
                k++;
                count++;
            }


        i++;
    }


    for(long long g=count-1; g>=0; g--)
        cout<<a[g];
        cout<<"\n";

}
return 0;
}

person user3125772    schedule 26.05.2014    source источник
comment
Просто чтобы убедиться: какой у вас результат на 100! ?   -  person tgmath    schedule 26.05.2014
comment
Ваш код не работает на 15!. Он печатает 11307674368000 вместо 1307674368000   -  person Blastfurnace    schedule 26.05.2014
comment
На самом деле я только что проверил количество конечных нулей на 100! и предположил, что это правильно, не проверяя фактические значения. Спасибо!   -  person user3125772    schedule 26.05.2014


Ответы (2)


Эта строка:

a[k]=temp;

должно быть:

a[k]=temp % 10;
person stark    schedule 26.05.2014

Попробуйте это

#include <iostream>

long double factorial(int n)
{
    long double r = 1;

    while(n > 1){
        r *= n;
        --n;
    }

    return r;
}

int main()
{
    std::cout << factorial(100) << std::endl;

    system("PAUSE");
}
person HoboCannibaL    schedule 26.05.2014
comment
double теряет точность и дает неверные ответы для SPOJ, так как его преобразование в строку отличается. На самом деле ваш факториал(100) != 100! - person styrofoam fly; 26.05.2014