【发布时间】:2019-01-07 10:42:40
【问题描述】:
我的程序从这个表达式中打印出所有素数:
((1 + sin(0.1*i))*k) + 1, i = 1, 2, ..., N.
输入格式:
不超过 100 个示例。每个示例在同一行上都有 2 个正整数。
输出格式:
在单独的行上打印每个数字。
示例输入:
4 10
500 100
样本输出:
5
17
但是我的算法效率不够。如何添加 Eratosthenes 筛子,使其足够高效,不打印“因超时而终止”。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long k, n;
int j;
while (cin >> k >> n) {
if (n>1000 && k>1000000000000000000) continue;
int count = 0;
for (int i = 1; i <= n; i++) {
int res = ((1 + sin(0.1*i)) * k) + 1;
for (j = 2; j < res; j++) {
if (res % j == 0) break;
}
if (j == res) count++;
}
cout << count << endl;
}
system("pause");
【问题讨论】:
-
我认为您应该将您的问题迁移到codereview.stackexchange.com
-
我是否理解正确,您需要计算数字
r=((1+sin(0.1*i))*k)+1中的素数数量为i=1..n和一组最多 100 对(n,k)? -
r将是表达式的数字结果。然后检查它是否是素数,忽略最多100对的集合。 -
在您的代码中,
res通常有多大? -
在尝试提高速度之前,我们必须确保程序提供正确的输出。这就是我提到这个问题的原因。使用大的
k和int可以溢出