C++ 主要因素产出——什么';问题是什么?

C++ 主要因素产出——什么';问题是什么?,c++,primes,C++,Primes,我正在进入,正在为UVA 583(主要因素)制定解决方案 我最近为此开发了一个Java解决方案,并得到了认可。当我尝试将它翻译成C++时,它总是得到“错误答案”(WED)(尽管错误的答案),即使对于每个测试用例,两个程序都输出相同的答案。 有人能指出哪里出了问题吗 #include <iostream> #include <string> #include <cmath> #include <stdio.h> using namespace std

我正在进入,正在为UVA 583(主要因素)制定解决方案

我最近为此开发了一个Java解决方案,并得到了认可。当我尝试将它翻译成C++时,它总是得到“错误答案”(WED)(尽管错误的答案),即使对于每个测试用例,两个程序都输出相同的答案。 有人能指出哪里出了问题吗

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
整数素数[4792];
无效因子分解(int-x1){
int c=0;
对于(int i=0;i
这几乎总是一个坏主意。由于浮点运算的精度有限,最终可能会出现在数学意义上两者完全相等的情况,但上面的测试结果为假。

在您的
因子分解(int-x1)
中,刚好在
while
上方,添加
if(x2*x2>x1)中断;


在你的
main()
if(primes[j]瓦城和UVA意味着什么?请至少显示一个链接到问题的规格。此外,因为最近你为这个被接受的java解决方案,如何将它与C++解决方案并排进行?可以有人可以执行等价性检查。@ SeGuffTe09:我不知道它们是如何标记这些东西的,但是风格上你的代码是HO。错误。试着把问题分解成几个部分,并将每个部分编码为一个单独的函数。@jahhaj是的,我认为这确实与我呈现输出的方式有关……可能在某个地方有一个额外的空间,我不能detect@segfaulter09:你把printf和cout混合在一起,也许不是个好主意。我删除了双重铸造比较d用模替换了它,我仍然得到了一个错误的答案。不可能有
那么,数组大小必须调整,否则,现在使用
%
,这将产生正确的因式分解。(Daniel回应了我的评论,我很快删除了它,半开玩笑地建议将
factorize
中的循环更改为最多4838以进行补偿).但是改变
@Daniel的笑话是,如果到目前为止它在没有分段故障的情况下工作,那么它可以在没有阵列大小调整的情况下继续工作…但是我认为这是一个糟糕的笑话。:)是的,确实可以。是的,这很可怕,UB应该是这样的。
while((double)x1/(double)x2 == (double)(x1/x2)){