新人求助,输出2到1000之间所有素数

qq_41309685 2017-12-17 03:50:18
为什么运行总是输出所有数QAQ.......求指点
#include<stdio.h>
int main()
{
int x,i,b=0;
for(x=2;x<=1000;x++)
{
for(i=1;i<=x;i++)
{
if(x%i==0)
b=b+1;

}
if(b=2)
{printf("%d\n",x);
b=0;}
}
}
...全文
2125 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
鲸落人将去 2019-12-26
  • 打赏
  • 举报
回复
你没有输入语句,就是scanf语句
metohang 2017-12-21
  • 打赏
  • 举报
回复
if(b=2) 新手常换的错误,数字在前,参数在后就不会。
zq775214 2017-12-21
  • 打赏
  • 举报
回复
int x, i, b = 0; for (x = 2; x <= 10000; x++) { for (i = 1; i <= x; i++) { if (x%i == 0) b = b + 1; if (b > 2) break; } if (b == 2) printf("%d \t", x); b = 0; } 优化时间
YJHCUI 2017-12-21
  • 打赏
  • 举报
回复
输出素数的问题基本上初学循环都会遇到这个例题。给出的源代码犯了一个不少初学者都会犯的错误。

看下面这个。
if(b=2)

括号里的内容是一个赋值语句,也就是说把2赋给b这个变量,相当于每次判断都是在判断2这个数字,必然每次都是真的,所以每个数都会输出。
而根据你的意思,应该要用到的是这样的语句。
if(b==2)

这样可以解决输出所有数的问题,但是算法本身是有问题的,更改后的代码我跑了一下,只会输出2和3两个数字。
以下内容讨论在已经更改以上错误的基础上。
读你的代码,b应该是这个数字的因数个数,如果有1和x两个因数的话,b应该是2,就输出。
想法没错,但是有一点小瑕疵,b=0;的语句不应该在if包括的范围内。
自己想以下这个过程。
2,是素数,b=2,进if,输出后b赋值0。
3,是素数,b=2,进if,输出后b赋值0.
4,不是素数,b=3,不进if。
这时候问题出现了,b在对5判断的时候初始就是3,5每有一个因数,b只会变大,不会再为2,不会再进if,以后的所有数都是这样,因此只输出了2和3。

下面代码是在你的代码基础上修改得出的。算法还是按照你的算法。
#include<stdio.h>
int main()
{
int x,i,b=0;
for(x=2;x<=1000;x++)
{
for(i=1;i<=x;i++)
{
if(x%i==0)
b=b+1;
}
if(b==2)
printf("%d\n",x);
b=0;
}
return 0;
}


求素数还有另外一种算法,是从2到x-1之间如果还有其他因数,就可以确定x是素数,有兴趣也可以尝试一下。
qq_35276837 2017-12-19
  • 打赏
  • 举报
回复
b=2 改成b==2即可
Extratessitrial 2017-12-19
  • 打赏
  • 举报
回复

#include<stdio.h>
int main()
{
	int i=0,j=0;
	int a[1001];
	for(i=0;i<=1000;i++)
		a[i]=1;
	for(i=2;i<=1000;i++)
	{
		if(a[i])
		{
			printf("%6d",i);
			for(j=i+1;j<=1000;j++)
			{
				if(j%i==0)	
					a[j]=0;
			}
		}
	}
	return 0;
}
另一种思路
赵4老师 2017-12-18
  • 打赏
  • 举报
回复
Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers
自信男孩 2017-12-17
  • 打赏
  • 举报
回复
#include<stdio.h>
#include <math.h>

#define LINE_MAX  10

int is_prime(int n);

int main()
{
	int i, cnt = 0;

	for (i = 2; i < 1000; i++)
		if (is_prime(i)) {
			printf("%3d ", i);
			cnt++;
			if (cnt % LINE_MAX == 0)
				putchar(10);
		}

	printf("\n total prime is %d\n", cnt);
	/*
	int x, i, b=0;

	for(x=2;x<=1000;x++)
	{

		for(i=1;i<=x;i++)
		{

			if(x%i==0)
				b=b+1;

		}
		if(b=2)
		{
			printf("%d\n",x);
			b=0;}
	}
	*/
        return 0;
}

int is_prime(int n)
{
	int i, size;
	size = sqrt(n);
	for (i = 2; i <= size; i++)
		if (n % i == 0)
			break;

	if (i > size)
		return 1;

	return 0;
}
参考一下吧; 注意
if(b=2)
这个问题很普遍,b = 2是赋值表达式,不是判断表达式,因此应该是:
if(b==2)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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