求100-200间的素数和 答案是1、i<=k 2、break 3、i>k 为什么这么填?k=sqrt(m)是什么意思?谢谢了
答案:4 悬赏:20 手机版
解决时间 2021-04-01 10:49
- 提问者网友:我一贱你就笑
- 2021-03-31 17:32
求100-200间的素数和 答案是1、i<=k 2、break 3、i>k 为什么这么填?k=sqrt(m)是什么意思?谢谢了
最佳答案
- 五星知识达人网友:何以畏孤独
- 2021-03-31 17:38
k=sqrt(m)是求m的二次方根,第一空是一种快速判定是否为质数方法,即将所要判定的数一次除以2到sqrt(m),其中没有出现整除的情况那么这个数就是质数。
第二空的意思是结束本循环。即:当出现m可以整除2到sqrt(m)中任何一个数时,就判定个m不是质数,跳出这次循环,然后m+1,再次进行判定。
第三空的意思是当出现i>k情况还没有出现m整除k时,则判定m为质数,进行累加。
第二空的意思是结束本循环。即:当出现m可以整除2到sqrt(m)中任何一个数时,就判定个m不是质数,跳出这次循环,然后m+1,再次进行判定。
第三空的意思是当出现i>k情况还没有出现m整除k时,则判定m为质数,进行累加。
全部回答
- 1楼网友:怀裏藏嬌
- 2021-03-31 21:58
k是m的开平方根。这样循环次数少些,效率好些
- 2楼网友:玩家
- 2021-03-31 19:16
s in Pª 时写下的
它找出小于N+1的素数
称为"筛选法",
"筛选法" 是古老的算法了, 考虑乘法的运算时间不是 O(1) , 这个算法是个NP算法
在linux下你可以用 工具gprof 去看运行时间, 里只提供了简单方法
在kernel api 里有较准确的方法, 但没必要
#include
#include
#define _Deleted -1
void SiezePrime(int*, int);
int main(void)
{
int i, j,
N; // Range of integers to sieze.
int *a; // Input.
printf("Input:");
scanf("%d", &N);
// Init a.
a = malloc(sizeof(int) * (N));
for (i = 2; i < N; i++)
a[i] = i;
// Find prime in array a.
SiezePrime(a, N);
// Output.
for (i = 2, j = 0; i < N; i++)
if (a[i] != _Deleted)
{
printf("%6d", a[i]);
// j is used to fomate the output.
if (++j % 10 == 0)
printf("\n");
}
}
void SiezePrime(int *a, int N)
{
int i,j, sqrtN;
sqrtN = sqrt(N)+1; // to avoid rounding errors.
for (i = 2; i < sqrtN; i++)
{
if(a[i] == _Deleted) continue;
for (j = 2*i; j < N; j+=i)
a[j] = _Deleted;
}
}
另外,站长团上有产品团购,便宜有保证
它找出小于N+1的素数
称为"筛选法",
"筛选法" 是古老的算法了, 考虑乘法的运算时间不是 O(1) , 这个算法是个NP算法
在linux下你可以用 工具gprof 去看运行时间,
在kernel api 里有较准确的方法, 但没必要
#include
#include
#define _Deleted -1
void SiezePrime(int*, int);
int main(void)
{
int i, j,
N; // Range of integers to sieze.
int *a; // Input.
printf("Input:");
scanf("%d", &N);
// Init a.
a = malloc(sizeof(int) * (N));
for (i = 2; i < N; i++)
a[i] = i;
// Find prime in array a.
SiezePrime(a, N);
// Output.
for (i = 2, j = 0; i < N; i++)
if (a[i] != _Deleted)
{
printf("%6d", a[i]);
// j is used to fomate the output.
if (++j % 10 == 0)
printf("\n");
}
}
void SiezePrime(int *a, int N)
{
int i,j, sqrtN;
sqrtN = sqrt(N)+1; // to avoid rounding errors.
for (i = 2; i < sqrtN; i++)
{
if(a[i] == _Deleted) continue;
for (j = 2*i; j < N; j+=i)
a[j] = _Deleted;
}
}
另外,站长团上有产品团购,便宜有保证
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯