求质数 线性筛法问题

stecdeng 2006-11-15 09:00:22
/* ------------------------------------------------------ */
/* PROGRAM linear sieve program of Gries and Misra : */
/* This program finds all prime numbers between 2 and */
/* n, the input, by using Gries and Misra linear sieve */
/* method. This method does not use division, instead */
/* multiplications are used. */
/* */
/* Copyright Ching-Kuang Shene July/10/1989 */
/* ------------------------------------------------------ */

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 1000
#define NEXT(x) x = next[x]
#define REMOVE(x) { next[previous[x]] = next[x]; \
previous[next[x]] = previous[x]; \
}
#define INITIAL(n) { unsigned long i; \
for (i = 2; i <= n; i++) \
previous[i] = i-1, next[i] = i+1;\
previous[2] = next[n] = NULL; \
}

int main(void)
{
unsigned long previous[MAXSIZE+1]; /* prev. pointer */
unsigned long next[MAXSIZE+1]; /* next pointer */
unsigned long prime, fact, i, mult;
unsigned long n;
unsigned long count = 0;
char line[100], dummy;

printf("\nLinear Sieve Program");
printf("\n====================");
printf("\n\nPrime Numbers between 2 to --> ");
gets(line);
n = strtoul(line, &dummy, 10);

INITIAL(n); /* initial the set */
for (prime = 2; prime*prime <= n; NEXT(prime))
for (fact = prime; prime*fact <= n; NEXT(fact))
for (mult = prime*fact; mult <= n; mult *= prime)
REMOVE(mult); /* remove multiples */

for (i = 2; i != NULL; NEXT(i)) { /* display result */
if (count % 8 == 0) printf("\n");
printf("%6ld", i);
count++;
}
printf("\n\nThere are %ld Prime Numbers in Total", count);
}








gets(line);
n = strtoul(line, &dummy, 10);作用是?
DEC C++下无法运行 谢谢
...全文
435 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞哥 2006-11-16
  • 打赏
  • 举报
回复
stdlib.h
将数值字符串转换成长整形格式数
long strtol(const char *s, char **endptr, int radix)
s 待转换的浮点字符串,radix 转换的数制
stecdeng 2006-11-16
  • 打赏
  • 举报
回复
谢谢
现在运行有问题
INITIAL (n) 出问题了
39 [Warning] assignment makes integer from pointer without a cast

for (i = 2; i != NULL; NEXT(i)) { /* display result */
45 [Warning] comparison between pointer and integer

jixingzhong 2006-11-15
  • 打赏
  • 举报
回复
事实上,
这么改更直接:
gets(line);
n = strtoul(line, &dummy, 10);
==》
scanf("%ul", &n);
直接输入 n 的值就是了
jixingzhong 2006-11-15
  • 打赏
  • 举报
回复
你把它改一下:
n = strtoul(line, &dummy, 10);
==》
n = strtol(line, &dummy, 10); //转换成 long 就可以了
jixingzhong 2006-11-15
  • 打赏
  • 举报
回复
输入一个字符串,
然后转换成 unsigned long ...
stecdeng 2006-11-15
  • 打赏
  • 举报
回复
谢谢 请问
strtoul 包含在哪个.h文件里?



现在
INITIAL 出问题了
39 [Warning] assignment makes integer from pointer without a cast

for (i = 2; i != NULL; NEXT(i)) { /* display result */
45 [Warning] comparison between pointer and integer

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧