主要因素输出 - 问题是什么?

时间:2012-08-05 15:47:31

标签: c++ primes

我正在进入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;
}

2 个答案:

答案 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个这样的正方形。