我正在进入UVA online programming competition,正在研究UVA 583(Prime因素)的解决方案。
我最近为此获得了Java解决方案。当我尝试将其翻译成C ++时,它总是得到WA(“错误答案”),即使我为每个测试用例输出,两个程序都输出相同的答案。
有谁可以指出什么是错的?
#include <iostream>
#include <string>
#include <cmath>
#include <stdio.h>
using namespace std;
int primes [4792];
void factorize(int x1){
int c = 0;
for(int i = 0;i<4792;i++){
int x2 = primes[i];
while(x1%x2==0){
if(c!=0)
cout<<" x ";
cout<<x2;
c++;
x1/=x2;
}
}
if(x1>1 && c!=0){
cout<<" x "<<x1;
}
if(c==0)
cout<<x1;
cout<<endl;
}
int main(){
primes[0]=2;
primes[1]=3;
int count = 2;
for(int i=5; i<46340;i+=2){
if(i%6 != 1 && i%6 != 5)
continue;
int limit = (int)sqrt((double)i);
bool isPrime = true;
for(int j=0;j<count;j++){
if(primes[j]<limit){
if(i%primes[j]==0){
isPrime = false;
break;
}
}
}
if(isPrime){
primes[count]=i;
count++;
}
}
int x = 0;
cin>>x;
while(x!=0){
string out;
cout<<x<<" = " ;
int x1 = x;
if(x<0){
cout<< "-1 x ";
x1*=-1;
}
factorize(x1);
cin>>x;
}
return 0;
}
答案 0 :(得分:1)
while((double)x1/(double)x2 == (double)(x1/x2)){
这几乎总是一个坏主意。由于浮点运算的精度有限,你最终可能会遇到数学意义上两者完全等价的情况,但上面的测试结果是错误的。
答案 1 :(得分:1)
在factorize(int x1)
上方,while
上方,添加if (x2*x2 > x1) break;
。
在main()
中,if(primes[j]<limit){
应使用<=
,其中应包含else
条{break;}
。用<
代替<=
我很惊讶它在Java中对你有用。
实际上,使用<
时,您的代码无法识别46340以下的前46个素数 - 它将放在数组末尾 1 其中他们仍然遥不可及。写过数组的结尾本身就很糟糕。
1 ,因为它错误地将素数的正方形识别为素数,并且在5和46340之间有46个这样的正方形。