UVA 195 Anagram - 运行时错误 - C ++

时间:2014-07-28 14:51:53

标签: c++

我正在尝试解决UVA 195问题,但除了测试中的准确结果外,在线评判还会返回“运行时错误”。

称为“fatorial”的函数计算给定数字的阶乘。 称为“permutacoes”的函数计算给定单词的排列数。

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>

using namespace std;

int fatorial (int a){
    int resultado = 1;
    for(int i=1; i<=a; i++) resultado *= i;
    return resultado;
}

int permutacoes (string s){
    int t = s.length();

     //conta as repetições de cada letra
    int rep[t];
    for(int i=0; i<t; i++) rep[i]=1;
    for(int i=0; i<t; i++){
        if(rep[i]==1){
            for(int j=(i+1); j<t; j++){
                if(s[i]==s[j]){
                    rep[i]++;
                    rep[j] = 0;
                }
            }
        }
    }

    //Calcula o número de permutações
    int fat = fatorial(t);
    int dividendo = 1;
    for(int i=0; i<t; i++){
            if(rep[i]>1) dividendo *= fatorial(rep[i]);
    }
    int resultado = fat/dividendo;
    return resultado;
}

int main()
{
    int n;
    string s;
    cin>>n;

    while(n--){
        cin>>s;
        sort(s.begin(),s.end()); //Ordem inicial
        cout<<s<<endl; //Primeira saída

        int perm = permutacoes(s);
        //Todas as permutações, menos a primeira que já foi dada pelo sort
        while (--perm){
            next_permutation(s.begin(),s.end());
            cout<<s<<endl;
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

问题可能在于您计算排列数的方式。该程序可能试图划分一些非常大的数字,但其中一个数字可能溢出(大于int的最大值),因此不正确。

用单词“aaaaaaaaaabbbbbbbbbb”检查你的算法(10个字母'a'和10个字母'b')。你应该得到20!/(10!* 10!)= 184756排列,但我打赌你会得到一些其他价值。将程序输出重定向到文件,以便更快地完成。

要解决此问题,请移除函数permutacoes并在next_permutation返回true时运行循环。当next_permutation返回false时,不再有排列,并且该单词应按循环之前的顺序排序。