| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1986 人关注过本帖
标题:这两个都是求素数的,第二个是对的,请问第一个哪里错了
只看楼主 加入收藏
小青345
Rank: 2
等 级:论坛游民
帖 子:64
专家分:15
注 册:2017-8-24
结帖率:0
收藏
 问题点数:0 回复次数:7 
这两个都是求素数的,第二个是对的,请问第一个哪里错了
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 素数 
2017-11-21 10:03
如此美好
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-11-17
收藏
得分:0 
首先第一个if下面差括号,其次下面的else需要前面有if,你的第一个if在for里面,不知道你的括号怎么打的。
2017-11-21 15:28
如此美好
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-11-17
收藏
得分:0 
而且第一个程序每循环一次,输出一次,总有除得断的,也有除不断的,最后会输出好多结果。
2017-11-21 15:31
ls913240512
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-11-4
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

这是运行的结果,你没有理解if语言和for语言的运行机制。
2017-11-22 12:15
小小世界
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-15
收藏
得分:0 
第一个应该也要在if里面加一个break,然后在外面再输出吧,,不然就会每次循环都输出一次
2017-11-22 16:43
小小世界
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-15
收藏
得分:0 
判断一个数是否是素数,大概有以下3种方法:

#include<stdio.h>

int main()
{
    int n,ans=0;
    while(scanf("%d",&n)!=EOF)
    //自己想输入多少个数就输入多少个数,直到 Ctrl+Z 时停止输入.并且 输入一个数就输出一个结果
    {
        if(f(n))//如果n是素数就输出Yes,,这里的f(n)是自己定义的一个函数 用来判断n是不是素数
            printf("Yes\n");
        else
            printf("No\n");
    }
   
    return 0;
}


1.根据素数的定义,判断能不能被除自己和1之外的数整除,从2遍历到n-1;

bool f(int n)
{
    for(int i=2;i<=n-1;i++)
        if(!(n%i))
            return false;
    return true;
}
2.由于当一个数分解成两个数的乘积是 这两个数肯定一个大于等于sqrt(n) 一个小于等于sqrt(n),所以如果我们在srqt(n)的左侧找不到n的约数,相应的在右侧也找不到,所以1方法中for循环不必循环到n-1只需要循环到sqrt(n)即可;

bool f(int n)
{
    for(int i=2;i<=sqrt(n);i++)
        if(!(n%i))
            return false;
    return true;
}

3.

首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;

证明:令x≥1,将大于等于5的自然数表示如下:
······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······
可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。这里有个题外话,关于孪生素数,有兴趣的道友可以再另行了解一下,由于与我们主题无关,暂且跳过。这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。
根据以上规律,判断质数可以6个为单元快进,即将方法(2)循环中i++步长加大为6,加快判断速度,代码如下:

bool f(int n)
{
    if(n==2||n==3)return true;
    if(n%6!=1&&n%6!=5)return false;//不在6的两侧肯定不是素数
    LL tmp=sqrt(n);
    for(int i=5;i<=tmp;i+=6)//在6的两侧也不一定全是素数
        if(n%i==0||n%(i+2)==0)//前面为左侧,后面为右侧
            return false;
    return true;

}


大佬教我的方法,希望对你有点帮助吧
2017-11-22 16:45
一次领域
Rank: 2
等 级:论坛游民
帖 子:12
专家分:15
注 册:2017-11-15
收藏
得分:0 
多了一个{,或者少了一个}
2017-11-22 18:00
帅死不偿命
Rank: 2
等 级:论坛游民
威 望:1
帖 子:14
专家分:30
注 册:2017-10-9
收藏
得分:0 
我个人认为判断一个数是不是素数可以简单很多
#include<stdio.h>
void  main()
{
     int  a,b;
      scanf("%d",&a);
      if(a>0)
     {
        b=a%2;
        if(b==1)printf("%d是素数\n",a);
       else
        {
           if(a==2)printf("%d是素数\n",a);
           else
             printf("%d不是素数\n",a);
          }
     }
     else
      printf("请重新输入\n");
}
         
      
2017-11-23 19:22
快速回复:这两个都是求素数的,第二个是对的,请问第一个哪里错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025263 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved