求100以内素数的问题

simon1990 2012-02-17 05:38:18
程序A:

int i;
int j;
for(i=2;i<100;i++){
for(j=2;j<i;j++){
if (i%j==0)
break;
if(i%j != 0);
printf("%d\n",i);
}


}

程序B:

int i,j;
for(i=2;i<100;i++ ){
for (j=2;j<=(i/2);j++)
if (i%j==0)
break;
if (i%j!=0)
printf("%d\n",i);
}


程序B是正确的,A是我自己写的,我在二层循环的时候蒙圈了……B的那个二层循环j<=i/2是怎么个意思,还有两个程序只是差了一个大括号,求高手指点一下,谢谢
...全文
480 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuiqiuqiu 2012-02-20
  • 打赏
  • 举报
回复
B程序输出怎么没有2和3呢
wizard_tiger 2012-02-18
  • 打赏
  • 举报
回复
11楼正解!
无间虚者 2012-02-18
  • 打赏
  • 举报
回复
i/2是减少不必要的循环,跟sqrt差不多!
King0325 2012-02-18
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<math.h>
void main(){
int i,n=100;
while(n>1){
i=(int)sqrt(n);
if(i==1){
printf("%-4d",n);
n--;
}
while(i>=2)
if(n%i!=0)
if(i==2){
printf("%-4d",n);
n--;
}
else
i--;
else{
n--;
break;
}

}


}
正解。
King0325 2012-02-18
  • 打赏
  • 举报
回复
n=100;
King0325 2012-02-18
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<math.h>
void main(){
int i,n=4;
while(n>1){
i=(int)sqrt(n);
while(i>=2)
if(n%i!=0)
if(i==2){
printf("%d",n);
n--;
}
else
i--;
else
n--;
printf("%d",n);
n--;
}


}
我写了一个,流程图都画出来了,可不知道哪出问题了,得不到正确结果~~
zmkkobe 2012-02-18
  • 打赏
  • 举报
回复
10楼的是已经给出答案了
yht8708 2012-02-18
  • 打赏
  • 举报
回复
int i;
int j;
bool flag = false;
for(i=2;i<100;i++){
for(j=2;j<i;j++){
if (i%j==0)
{
flag = true;
break;
}
}
if(flag)
printf("%d\n",i);
flag = false;
}
第一个 可以加个控制变量

小霍 2012-02-18
  • 打赏
  • 举报
回复
//这个也可以
int i,j;
for(i=2;i<100;i++ ){
for (j=2;j<i;j++)
if (i%j==0)
break;
if(j==i)
printf("%d\n",i);
}
taoyh2002 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wangyaqi123 的回复:]
i/2是减少不必要的循环,跟sqrt差不多!
[/Quote]

对于 100, i/2是50, sqrt(i)是10,差得不多?
taoyh2002 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pathuang68 的回复:]
引用 10 楼 anyidan 的回复:

C/C++ code

bool isPrime(int number) {
int i;
int k;

k = (int)sqrt((double)number); // 用平方根,而非用number/2,相对提高速度sqrt(number)/2倍
for(i = 2; i <= k; i++)
{
……


++
这才……
[/Quote]
要说性能,改造一下,还可提高近一半的性能:

bool isPrime(int number) {
int i;
int k;

if (number < 2) return false;

if (number==2) return true;

if (number % 2 == 0) return false; //>2的偶数不是素数

k = (int)sqrt((double)number); // 用平方根,而非用number/2,相对提高速度sqrt(number)/2倍
for(i = 3; i <= k; i+=2) //只需要用奇数去除,偶数已排除
{
if(number%i==0)
break;
}
if (i > k) return true; // 没有找到可以整除的除数,被除数是 prime number
else return false;
}
pathuang68 2012-02-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 anyidan 的回复:]

C/C++ code

bool isPrime(int number) {
int i;
int k;

k = (int)sqrt((double)number); // 用平方根,而非用number/2,相对提高速度sqrt(number)/2倍
for(i = 2; i <= k; i++)
{
……
[/Quote]

++
这才是标准的做法。前面的代码如果要考察效率的话,是不合格的。
ProgrammingRing 2012-02-17
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <math.h>

int main(void)
{
int num;
int index;
int prime = 1;

for(num = 2; num <= 100; num++)
{
/*
** 检测是否还能被其他数整除
*/
for(index = 2; index <= sqrt(num); index++)
{
if(num % index == 0)
{
prime = 0; // 质数的标记,为0则不是质数
break;
}
}
if(num % num == 0 && num % 1 == 0 && prime)
printf("%d ", num);
prime = 1; // 还原标记
}
putchar('\n');
return 0;
}
AnYidan 2012-02-17
  • 打赏
  • 举报
回复

bool isPrime(int number) {
int i;
int k;

k = (int)sqrt((double)number); // 用平方根,而非用number/2,相对提高速度sqrt(number)/2倍
for(i = 2; i <= k; i++)
{
if(number%i==0)
break;
}
if (i > k) return true; // 没有找到可以整除的除数,被除数是 prime number
else return false;
}



来自网上
taoyh2002 2012-02-17
  • 打赏
  • 举报
回复

int isprime(int n)
{
int i;

if (n < 2)
return 0;

if (n == 2)
return 1;

if (n % 2 == 0) //偶数不是素数
return 0;

for(i = 3; i * i <= n; i+=2) // 偶数已过滤
{
if ( (n % i) == 0)
{
return 0;
}
}
return 1;
}

int main()
{
#define N 100
int j = 0;
for (j=2; j <= N; j++)
{
if (isprime(j))
printf("%d ", j);


return 0;
}

huhaifengasd 2012-02-17
  • 打赏
  • 举报
回复
/2 是减少要不必要的循环,你没加大括号的话之执行之后的一条语句就是 ;
  • 打赏
  • 举报
回复
第二个也不对


#include <stdio.h>

void fun()
{
int i,j;
int flag;

for(i = 2; i < 100; i++)
{
flag = 1;
for (j = 2; j <= (i/2); j++)
{
if ( (i % j) == 0)
{
flag = 0;
break;
}
}
if (flag)
{
printf("%d ", i);
}
}
}

void main()
{
fun();
}
whc748227431 2012-02-17
  • 打赏
  • 举报
回复
楼主,这里有一种方法,参考下:

#include<stdio.h>
main()
{
int i,j;
int flag=0;
for(i=2;i<100;i++)
{for(j=2;j<i;j++)
{if(i%j==0) {flag=1;break;}
}
if(flag!=1) printf("%6d",i);
flag=0;
}
}
ken_scott 2012-02-17
  • 打赏
  • 举报
回复
有时间可以看下我的博客, 里面有一篇是讲求素数的
whc748227431 2012-02-17
  • 打赏
  • 举报
回复
楼主确定B程序正确?我怎么调试了没有2吗,2不是也是素数吗?
加载更多回复(3)

69,371

社区成员

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

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