输出错误:两个不同编译器的不同输出:Prime Cryptarithm USACO

时间:2017-05-25 04:22:33

标签: c++

以下的密码是一个乘法问题,可以通过将指定的N个数字组中的数字替换为标有*的位置来解决。如果选择了一组素数{2,3,5,7},则密码称为PRIME CRYPTARITHM。例如:

      * * *
     x  * *
    -------
      * * *         <-- partial product 1
    * * *           <-- partial product 2
    -------
    * * * *

这些恒星只能由USACO分级员给出的一组定义的整数N替换。 部分商品的长度必须为三位数。

提供的数据:

4       /* <-- This is the given size of set N from which the multiplicand and multiplier is taken */
2 3 5 7 /* <-- Set N */

任务是计算可能结果的数量并输出数字。

我的问题: 在我的编译器中,输出为0,这是正确的,但在USACO分级器中,我的程序输出1.我无法确定问题所在。 有人可以帮我解决这个问题吗? 提前谢谢。

我的节目代码:

#include <iostream>
#include <fstream>

using namespace std;

int *sortInput(int arrSetN[], int numofDigs)
{
    for(int ictr=0;ictr<numofDigs;ictr++)
    {
        for(int jctr=ictr+1;jctr<numofDigs;jctr++)
        {
            if(arrSetN[ictr]>arrSetN[jctr])
            {
                swap(arrSetN[ictr],arrSetN[jctr]);
            }
        }
    }
    return arrSetN;
}
bool checkNum(int num,int arrSetN[],int numofDigs)
{
    int countDigits=0,tempNum=num,ictr=0,jctr=0;
    int *arrDigits,*digitTally;

    /*
    Counting the number of digits in num.    
    */
    for(;tempNum>0;)
    {
        tempNum=tempNum/10;
        countDigits++;
    }
    arrDigits=new int[countDigits];
    digitTally=new int[countDigits];

    /*
        making digitTally = 0
    */
    for(ictr=0;ictr<countDigits;ictr++)
        digitTally[ictr]=0;

    /*
        retrieving the digits of num.
    */
    for(ictr=0;ictr<countDigits;ictr++)
    {
        arrDigits[ictr]=num%10;
        num=num/10;
    }

    /*
        checking if all digits of num are part of set N.
    */
    for(ictr=0;ictr<countDigits;ictr++)
    {
        for(jctr=0;jctr<=numofDigs;jctr++)
        {
            if(arrDigits[ictr]==arrSetN[jctr])
                digitTally[ictr]=1;
        }
    }

    for(int cfc=0;cfc<countDigits;cfc++)
    {
        if(digitTally[cfc]==0)
            return false;
    }
    return true;
}

int main()
{
    ofstream fout("crypt1.out");
    ifstream fin("crypt1.in");
    int numofDigs,ictr=0,a,b,c,d, e,p1,p2,sum,p2test;
    int actr=0,bctr=0,cctr=0,dctr=0,ectr=0,tally=0;
    bool sumCheck,p1Check,p2Check;
    fin>>numofDigs;
    int *arrSetN;
    arrSetN = new int[numofDigs];
    for(ictr=0;ictr<numofDigs;ictr++)
    {
        fin>>arrSetN[ictr];
    }
    arrSetN=sortInput(arrSetN,numofDigs);
    for(actr=0;actr<numofDigs;actr++)
    {
        a=arrSetN[actr];
        for(bctr=0;bctr<numofDigs;bctr++)
        {
            b=arrSetN[bctr];
            for(cctr=0;cctr<numofDigs;cctr++)
            {
                c=arrSetN[cctr];
                for(dctr=0;dctr<numofDigs;dctr++)
                {
                    d=arrSetN[dctr];
                    for(ectr=0;ectr<numofDigs;ectr++)
                    {
                        e=arrSetN[ectr];
                        p1=((a*100)+(b*10)+c)*e;
                        p2=((a*1000)+(b*100)+(c*10))*d;
                        p2test=((a*100)+(b*10)+c)*d;
                        p1Check=checkNum(p1,arrSetN,numofDigs);
                        p2Check=checkNum(p2test,arrSetN,numofDigs);
                        if(p1>999 || p2test>999 || p1<100 || p2test<100)
                        {
                            continue;
                        }
                        sum=p1+p2;
                        sumCheck=checkNum(sum,arrSetN,numofDigs);
                        if(sumCheck==true && p1Check==true && p2Check==true)
                        {
                            tally++;
                            //fout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e;
                            //fout<<"\t"<<p1<<" "<<p2<<" "<<sum<<"\n";
                        }
                    }
                }
            }
        }
    }
    fout<<tally<<"\n";
}

1 个答案:

答案 0 :(得分:0)

通常,当程序的结果因编译器的不同而不同时,通常意味着程序中的某个地方会遇到未定义的行为。

在您的情况下,checkNum中j<=numofDigs的比较不正确。您在j==numofDigs时访问arrSetN的末尾。由于这是未定义的,您可以得到不同的结果。

可能还有其他类似的地方,但这是我注意到的地方。