Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błędna odpowiedź w zadaniu na SPOJu - FCTRL3

Ostatnio zmodyfikowano 2015-10-10 22:18
Autor Wiadomość
fifciuu
Temat założony przez niniejszego użytkownika
Błędna odpowiedź w zadaniu na SPOJu - FCTRL3
» 2015-10-10 20:32:37
Witam, ostatnio zacząłem robić zadania na SPOJu. No i przy tym oto zadaniu: http://pl.spoj.com/problems/FCTRL3/
Występują odpowiedź ze strony SPOJa, iż program daje błędną odpowiedź. Nie mam pojęcia co jest nie tak, główkuję nad tym kilka dni i nie mogę wymyślić. Pewnie to jakaś błachostka, której nie mogę dostrzec. Niżej prezentuję kod(oczywiście jest to wersja nr. 1 stworzona "na chłopski rozum"):

#include <iostream>
#include <string>

using namespace std;

int ile = 0;

long silnia( int num );
void longest( long in[], short siz, int &set );
void wypiszCyfry( long num, short longest );
void poKolei( string num, short len);

int longe;

int main(int argc, char *argv[]) {
    cin>>ile;
    if( ile<1 || ile>30 )
        return 0;
    long inputNum[ ile+1 ];
    int i = 1;
    do
    {
        cin>>inputNum[ i ];
        if( inputNum[ i ] < 1)
            return 0;
        if( !silnia( inputNum[ i ] ) )
            return 0;
        i++;
    } while(i<=ile);
    longest( inputNum, ile+1, longe );
    i = 1;
    do
    {
        long temp = silnia( inputNum[ i ] );
        if( !temp )
            continue;
        wypiszCyfry( temp, longe );
        cout<<endl;
        i++;
    } while(i<=ile);
    return 0;
}
long silnia( int num )
{
    long wynik = 1.0;
    if( num== 1 )
        return 1;
    for( int i = 2; i<=num; i++ )
        wynik*=i;
    if( wynik > 1000000000 )
         return 0;
    return wynik;
}
void longest( long in[], short siz, int &set )
{
    for( int i =1; i<siz; i++)
    {
        string strNum = to_string(silnia( in[ i ]));
        short len = strNum.length();
        if( len > set )
            set=len;
    }
}
void wypiszCyfry( long num, short longest )
{
    string strNum = to_string(num);
    short len = strNum.length();
    for( int i = 0; i<longest; i++)
    {
        if( len < longest){
             if( len+i < longest)
                 cout<<"0 ";
             else{
                 poKolei(strNum,len);
                 break;
             }
        }
        else{
            cout<<strNum.substr( i, 1 )<<" ";
        }
    }
}
void poKolei( string num, short len)
{
    for( int i = 0; i<len; i++)
        cout<<num.substr( i, 1 )<<" ";
}
P-138369
mateczek
» 2015-10-10 22:18:09
te zadania są czasami głupio pokomplikowane
1*2*3*4*5*6*7*9*10= 2*5*10=100*.... byle co dwie ostatnie cyfry to:

0 0

pamiętaj o spacjach między cyframi !!! w testach są tak wielkie liczby że zwyczajnie nie policzysz silnii
C/C++
for( int i = 2; i <= num; i++ ) {
    wynik *= i;
    wynik = wynik % 100; //chcesz tylko dwie cyfry przecierz
    if( wynik == 0 ) break; // dalej nie ma sensu liczyć!!!
   
}

a wyświetlenie dwóch cyfr po spacjach można na szybkiego.
cout << wynik / 10 << ' ' << wynik % 10 << endl;
P-138374
« 1 »
  Strona 1 z 1