TOPIC

PROBLEM 1457 - URI Fórum 1.0

URI Online Judge asked 7 years ago

URI Online Judge Fórum 1.0

MOD

This topic was solved and cannot recieve new replies.

  • Cristhian Bonilha replied 6 years ago

    Declare as variáveis como long long unsigned int dentro da função, para que os cálculos não causem overflow.

  • Daniel Perez replied 7 years ago

    Olá, não entendo porque minha resposta está 10% errada... ele devolve o resultado certo, porque está errado ?

    int i, j, n, cont=0, cont2=0, resposta;
        char resp[100]="d";
        double numero, aux;
    
        scanf("%i",&n);
        getchar();
    
        for(i=0;i<n;i++){
        cont=0;
        cont2=0;
    
        gets(resp);
            while(resp[cont]!= '\0'){
                if(resp[cont]=='!'){
                    cont2++;
                }
                cont++;
            }
    
        numero=atoi(resp);
            aux=numero;
            for(j=0;j<numero;j+=cont2){
                if(j!=0){
                    aux*=(numero-j);
                }
            }
            printf("%.lf\n",aux);
        }
  • Igor Carpanese replied 5 years ago

    O enunciado fala que nenhum resultado é maior do que dez elevado a dezoito.

  • 🧙The Install Wizard 🧙 replied 5 years ago

    O toolkit com a entrada :

    5
    100!
    80!
    60!
    40!
    20!

    gera a saída:

    0
    0
    -8718968878589280256
    -70609262346240000
    2432902008176640000

    A saída correta não seria essa ?

    93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
    71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000
    8320987112741390144276341183223364380754172606361245952449277696409600000000000000
    815915283247897734345611269596115894272000000000
    2432902008176640000
  • Jonatas Laet replied 6 years ago

    4
    1
    1!
    2
    2!

    A entrada acima entra em conflito com o enunciado, pois no enunciado diz: "(...)A primeira (e única) linha de cada instância contém um inteiro N seguido de K pontos de exclamação, onde 1 ≤ N ≤ 100 e 1 ≤ K ≤ 20."

  • Nathan Almeida replied 6 years ago

    Valeu Cristian, recebi acc aqui, estava devolvendo como long long unsigned mas a variável era do tipo int, nem reparei, obrigado

  • Nathan Almeida replied 6 years ago

    Estou com o mesmo problema, tô com 30% de erro aqui e não sei o que é. Meu código está com a mesma semântica que o seu. Alguém sabe onde está o erro aqui?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    long long unsigned int Fatorial(int ent, int fat){
        int res = ent, cont = 1;
        if(ent == 0)return 1;
        while(cont*fat < ent){
            res*=(ent-cont*fat);
            cont++;
            }
    
        return res;
        }
    
    using namespace std;
    main(){
    
        char num[25];
        int ent,qtd,fat;
        long long unsigned int res;
        scanf("%d",&qtd);
    
        for( ; qtd > 0; qtd--){
    
            scanf("%d%s",&ent,num);
            fat = strlen(num);
            res = Fatorial(ent,fat);
            printf("%llu\n",res);
            }
    
            //system("PAUSE");
        }
  • Old man replied 7 years ago

    Ola, Tem algum caso que esse código não passa? Por mim está certo mas deu Wrong answer (30%).

    #include <stdio.h>
    #include <stdlib.h>
    
    int fat(int n, int cont){
        if(n<=0 || n==1)
            return 1;
        else
            return(n*fat(n-cont, cont));
    }
    
    main(){
        int t, i, x=2, cont=0;
        char nome[100];
    
        scanf("%d", &t);
    
        while(t--){
            char num[x];
    
            scanf("\n%s", &nome);
    
            i=0; x=0; while(nome[i]!='\0'){
                if(nome[i]!='!'){
                    num[x]=nome[i];
                    x++;
                }else{
                    cont++;
                }
            i++;}
                num[x]='\0';
    
            printf("%d\n", fat(atoi(num),cont));
            cont=0;
        }
    }
  • Cristhian Bonilha replied 7 years ago

    Talvez seja porque a sua entrada não atende os requisitos do problema:

    Ou seja, deve haver ao menos um ponto de exclamação.

  • Rafael Campos replied 7 years ago

    O toolkit parece apresentar resultados conflitantes dependendo da ordem da entrada.

    Por exemplo, para a entrada:

    4
    1
    1!
    2
    2!

    a saída correspondente é

    1
    2
    2
    2

    Ao passo que se a entrada for

    4
    1
    1!
    1
    1!

    a saída passa a ser

    1
    1
    1
    1

    Isto é, no primeiro caso, 1! = 2 e no segundo, 1! = 1.

  • Wyllian Brito replied 7 years ago

    É isso mesmo, a resposta certa é 40320. No PDF da maratona estava errado e acabei esquecendo desse detalhe.

    Abs

  • Jaudir replied 7 years ago

    Olá no enunciado da questão temos 8! = 5040 o correto não seria 8! = 40320? No Toolkit aparece 40320. Vlw []'s