我试图找到素数,为此我做了:
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 ++,所以可能会忘记一些事情?
答案 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;