以下的密码是一个乘法问题,可以通过将指定的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";
}
答案 0 :(得分:0)
通常,当程序的结果因编译器的不同而不同时,通常意味着程序中的某个地方会遇到未定义的行为。
在您的情况下,checkNum中j<=numofDigs
的比较不正确。您在j==numofDigs
时访问arrSetN的末尾。由于这是未定义的,您可以得到不同的结果。
可能还有其他类似的地方,但这是我注意到的地方。