为什么C ++在循环中没有采用正确的值?

时间:2016-07-04 10:31:01

标签: c++

我试图找到素数,为此我做了:

int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */

int count;
cin >> count;

for(int i = 0; i < count; i++) {
    int num, num2;
    cin >> num;
    num2 = num;
    int res = 1;

    while(num > 1) {
        for(int j = 2; j < static_cast<int>(sqrt(num) + 0.5); j++) {
            int a = num2 % j;
            if(a == 0) {
                res = res * j;
                num2 = num2 / j;
                //cout << j << endl;
            }
        }
    }

    cout << "Result is: " << res << endl;
}
return 0;
}

但我不知道为什么,当我输入315时,它会打印我:3 5 3,没有7。但是当我粘贴17而不是static_cast<int>(sqrt(num) - 0.5)时,它也会给我17,它也会打印7

那么,问题是什么,当我输入17时它会打印7,但是当我用sqrt计算时 - 它不会?

此外,它不打印此cout << "Result is: " << res << endl;

我很长时间没有使用C ++,所以可能会忘记一些事情?

2 个答案:

答案 0 :(得分:3)

该程序试图计算一个数字。每当数字达到1时,它就被完全分解。所以循环应该是while (num>1)

此外,你无法提取素数的力量。如果num为8,您将获得2和4.如果您将“int a=num%j;if(a==0)”行替换为while (num % j == 0),则可以解决此问题。你会反复得到相同的素数,确定[如果你愿意也可以修复]。

好吧,我实际上已经引入了一个重要的性能问题来获得正确性。但我们能否重新获得表现?

您可以在for循环中添加其他条件:if (j * j > num) {cout<<num; num=1;}

在评论中,OP表示他希望获得所有主要因素并......将它们相乘?我将编写处理下面一个数字的代码:

int num, res = 1;
cin >> num;
for (int d = 2; d <= num; d++)
{
    while(num % d == 0) //while also acts as if
    {
        cout << d << " ";
        num = num / d; //or num /= d;
        res = res * d; //or res *= d;
    }
}
//here num is 1, res is the original number and the prime factors have been printed

答案 1 :(得分:1)

static_cast<int>(sqrt(315) - 0.5)等于17,但您可能会在for循环的上一次迭代中将num除以某些j,此处:

num = num / j;