素数 这样写为什么会错

Clujiawei 2009-11-29 07:39:57
/*判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
      则表明此数不是素数,反之是素数。     */

#include<stdio.h>
#include<math.h>
main()
{
int i;
for(i=101;i<=200;i++)
{ if(i/2%==0&&sqrt(i)%==0) printf("不是素数%d\n",i);
else printf("是素数%d\n",i);
}


}
  
...全文
219 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
z569362161 2009-12-01
  • 打赏
  • 举报
回复
结帖啊!

我只差50分就三个小三角了,能不能给50分啊!谢谢!
cao_jialian 2009-12-01
  • 打赏
  • 举报
回复
素数问题是一个经典问题,但有无数的初学者有着无穷的烦恼--不是初学者的问题,是教育者的问题,他(她)们没有教这类问题的基本方法:
问题描述:素数m是仅能被1和m整除的正整数,特别地,1不是素数。
换个说法就是在2至m-1范围(这个范围再讨论)内至少存在着一个整数因子k能整除m,只要能在指定的范围内找到任一(或几)个整数因子k,就可以下结论“m不是素数”。
也就是说否定“一个整数m是素数”是容易的,找这个整数因子k--“一票否决!”,但要肯定“一个整数m是素数”是困难的,一定要在指定的范围内无否决票!--不把这个范围内的整数因子都试除一次是不行的!
下一个问题就是这个范围就是从2到m-1吗?设q=m/k,r=m%k,(不必多解释了吧?q是整除的商、r是整除的余数)。当r为0时,k是一个否决因子,同时q也是一个否决因子!也就是说一次求余运算(%)就蕴含着可能求出两个否决因子k和q!由于k的试除是由小到大的,则q的出现一定是由大到小的--所以找一下k与q会合的地方?当m是个平方数时k==q!m不是平方数呢?k大于sqrt(m)后是不是到达了q的范围了?!

解题步骤:
对于任意给定的整数m,
1.当m<2,则m一定不是素数!
2.假设m是素数
3.取k从2至sqrt(m)
3.1.若m%k==0,否定假设--m一定不是素数,结束第3步
4.若假设没有被否定过,则m是素数,否则m不是素数。

代码设计:
int m,k;
int assume=1; /*假定m是素数*/
/*获取或生成m*/
if(m<2)
assume=0; /*m不是素数*/
else
for(k=2; k<=sqrt(m); k++)
if(m%k == 0)
{
assune=0;
break;
}
if(assume == 1)
/*m是素数的处理*/
else
/*m不是素数的处理*/
==================代码优化就不做了:“first make it work, then make it fast!"======

assume称作标志量----因为这个素数问题是否决容易,所以该标志量一开始假设为“是”(assume=1),然后通过一个循环过程尝试着去“否决”它(assume=0)。
k称作侯选项,需要 在一个范围内一一列举,又称作穷举侯选项。
这个方法称作穷举法,在程序设计的入门阶段是一个最基本的方法,并且在程序设计的每一个阶段,当没有想出更好的方法时,穷举法也是打开局面的一种方法。试一试这种方法吧----关键是假设“是”呢?还是假设“不是”呢?

顺便点评一下书上的代码
for(k=2; k<=sqrt(m);k++)
if(m%k==0)
break;
if(k>sqrt(m))
/*m是素数*/
else
/*m不是素数*/
这是利用k==sqrt(m)+1表示for循环是完整做完了而不是提前break出来的,间接认定m%k==0从没有实现过-->“m是素数”没有被否决过。这个法子表面上“节省”了一个变量assume,但用间接法子去判定一个事实--实在不是一个好法子--至少对初学者不是个好法子(不过若干年前可有人拼命叫好)。

由于素数的题目太多,求证素数的过程最好设计为一个函数
int isprime(int m)
{
int k;
if(m<2)
return 0; /*小于2的都不是素数*/
if(m%2 ==0)
return 0; /*偶数都不是素数*/
for(k=3; k*k<=m; k+=2) /*k从3开始,只选奇数做穷举侯选项*/
if(m%k == 0)
return 0; /*函数中的return 比break更干脆,退出循环并退出函数*/
return 1;
} /*没有使用标志量,一定蕴含着“m是素数”这一假设*/
voidsky 2009-11-30
  • 打赏
  • 举报
回复
楼主的代码。。。。
Clujiawei 2009-11-30
  • 打赏
  • 举报
回复


为什么要这样写if(j>(int)sqrt(i))
daojie 2009-11-30
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
main()
{
int i,j,k,count=0,leap=1;
for(i=101;i<=200;i++)
{
k=sqrt(i+1);
for(j=2;j<=k;j++)
{
if(i%j==0)
{
leap=0;
break;
}
}
if(leap)
{
printf("%d",i);
count++;
if(count%5==10)
printf("\n");
}
leap=1;
}
}
starix_cai 2009-11-30
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
for(int num = 101; num <= 200; num += 2)
{
int i;
for(i = 2; i < num; i++)
if(!(num % i))
break;
if(i == num)
printf("Prime Number Found: \t%d\n", num);
}
}
liangyonglou 2009-11-30
  • 打赏
  • 举报
回复
支持2楼
lyj7015 2009-11-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 z569362161 的回复:]
很简单的答案,让他们给改的乱七八糟.支持3楼的,
[/Quote]

顶!
z569362161 2009-11-29
  • 打赏
  • 举报
回复
很简单的答案,让他们给改的乱七八糟.支持3楼的,
jackyjkchen 2009-11-29
  • 打赏
  • 举报
回复
算法根本不对……

给你个对的

int TestPrime(unsigned long n)
{
unsigned long i = 0;
unsigned long sq = 0;
if(n == 1)
return false;
else if(n == 2)
return true;
if(!(n % 2))
return false;
sq = (unsigned long)sqrt((double)n);
for(i=2; i<=sq; i++)
{
if(!(n % i))
return false;
}
return true;
}
JecenFan 2009-11-29
  • 打赏
  • 举报
回复
是啊,楼主对素数理解有误
#include <stdio.h>
#include <math.h>
int main()
{
int i;
for(i=101;i <=200;i++)
{
int j;
for(j=2;j <=(int)sqrt(i);++j)
{
if(i%j==0)
{
printf("%d不是素数\n",i);break;
}
}
if(j>(int)sqrt(i))
printf("%d是素数\n",i);
}return0;
}
cattycat 2009-11-29
  • 打赏
  • 举报
回复
用一个数分别去除2到sqrt(这个数),sqrt(N)是用来停止循环的,如下面的:
for(j=2;j<=(int)sqrt(i);++j)

problc 2009-11-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sduxiaoxiang 的回复:]
这是写的啥啊

C/C++ code
#include<stdio.h>
#include<math.h>int main()
{int i;for(i=101;i<=200;i++)
{int j;for(j=2;j<=(int)sqrt(i);++j)
{if(i%j==0)
{
printf("%d不是素数\n",i);break;
}
}if(j>(int)sqrt(i))
printf("%d是素数\n",i);
}return0;
}
[/Quote]
up
liem 2009-11-29
  • 打赏
  • 举报
回复
对素数的理解有问题:
如果n被2到sqrt(n)中某个数整除,则n不是素数,否则是素数。
其中否则的意思是:从2到sqrt(n)中的每个整数都不能整除n。
因此要判断是素数是在循环结束后进行的,而不是在循环中就能肯定的。
Eminas 2009-11-29
  • 打赏
  • 举报
回复
干嘛不用数组???
yxwsbobo 2009-11-29
  • 打赏
  • 举报
回复
for(int i=101;i!=200;++i)//200不是素数
{
int result =0;
for(int j=2;j!=sqrt(i);++j)
if(i%j == 0)
result =1;

if(result)
printf("不是素数\n");
else printf("是素数\n");
}

我估计你是这个意思
sduxiaoxiang 2009-11-29
  • 打赏
  • 举报
回复
这是写的啥啊


#include <stdio.h>
#include <math.h>
int main()
{
int i;
for(i=101;i <=200;i++)
{
int j;
for(j=2;j<=(int)sqrt(i);++j)
{
if(i%j==0)
{
printf("%d不是素数\n",i);
break;
}
}
if(j>(int)sqrt(i))
printf("%d是素数\n",i);
}
return 0;
}

blackbillow 2009-11-29
  • 打赏
  • 举报
回复
用一个数分别去除2sqrt(这个数)

你理解这个到字吗?
yxwsbobo 2009-11-29
  • 打赏
  • 举报
回复
if(i/2%==0&&sqrt(i)%==0) printf("不是素数%d\n",i);


i/2%==0

是什么。。。


在下不记得可以这样写吧

69,373

社区成员

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

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