| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 572 人关注过本帖
标题:有关素数的综合运用问题
只看楼主 加入收藏
hcjiaozhi
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2010-10-11
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:9 
有关素数的综合运用问题
我想找出同时满足超级素数、逆向超级素数和金蝉素数这三个条件的素数,模仿别人的程序,自已写了一个,但未成功,如下,请高手改一改,谢谢!

#include<stdio.h>

int prime(int x)
{
    int i,j=1;
    if(x==0||x==1)j=0;
    else
        for(i=2;i<x;i++)
        {
            if(x%i==0)
            {
                j=0;
                break;
            }
        }
        return j;
}

int cjss(int x)   /*此函数判断一个数是否它本身为素数且从个位开始依次去掉一位数字后仍为素数*/
{
    if(x<10)
    {
        if(prime(x)==1)return 1;else return 0;
    }
    else if(x<100)
    {
        if(prime(x)==1&&prime(x/10)==1)return 1;else return 0;
    }
    else if(x<1000)
    {
        if(prime(x)==1&&prime(x/10)==1&&prime(x/100)==1)return 1;
        else return 0;
    }
    else if(x<10000)
    {
        if(prime(x)==1&&prime(x/10)==1&&prime(x/100)==1&&prime(x/1000)==1)
            return 1; else return 0;
    }
}

int ncjss(int x)   /*此函数判断一个数是否它本身为素数且从高位开始依次去掉一位数字后仍为素数*/
{
    if(x<10)
    {
        if(prime(x)==1)return 1;else return 0;
    }
    else if(x<100)
    {
        if(prime(x)==1&&prime(x%10)==1)return 1;else return 0;
    }
    else if(x<1000)
    {
        if(prime(x)==1&&prime(x%10)==1&&prime(x%100)==1)return 1;
        else return 0;
    }
    else if(x<10000)
    {
        if(prime(x)==1&&prime(x%10)==1&&prime(x%100)==1&&prime(x%1000)==1)
            return 1; else return 0;
    }
}

int jcss(int x)   /*此函数判断一个数是否它本身为素数且从两头开始同时、依次去掉一位数字后仍为素数*/
{
    if(x<1000)
    {
        if(prime(x)==1&&prime(x%10)==1&&prime(x/10)==1)return 1;
        else return 0;
    }
    else if(x<10000)
    {
        if(prime(x)==1&&prime(x%100)==1&&prime(x/100)==1)
            return 1; else return 0;
    }
}

void main()
{
    int i,count=0;
    printf("同时满足超级素数、逆向超级素数和金蝉素数这三个条件的素数有:\n");
    for(i=100;i<=10000;i++)
    {
        if(prime(i)==1 && cjss(i)==1 && ncjss(i)==1 && jcss(i)==1)
        {
            count++;printf("%d\t",i);if(count%10==0)printf("\n");
        }
    }
}
图片附件: 游客没有浏览图片的权限,请 登录注册

313,317,797不是金蝉素数。

[ 本帖最后由 hcjiaozhi 于 2013-4-22 22:44 编辑 ]
搜索更多相关主题的帖子: include return 
2013-04-22 22:41
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
下次发链接,写个名字让我费解诶

你的金蝉素数的判断方法不对啊,比如123, x%10 = 3    x/10 = 1,但你题意应该判断 2 的

[ 本帖最后由 azzbcc 于 2013-4-23 08:15 编辑 ]


[fly]存在即是合理[/fly]
2013-04-23 08:14
hcjiaozhi
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2010-10-11
收藏
得分:0 
回复 2楼 azzbcc
哦,明白了,应该是:
 if(x<1000)
    {
        if(prime(x)==1&&prime(x/10%10)==1)return 1;
        else return 0;
    }
    else if(x<10000)
    {
        if(prime(x)==1&&prime(x/100%10*10+x/10%10)==1)
            return 1; else return 0;

运行成功!如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 hcjiaozhi 于 2013-4-23 19:59 编辑 ]
2013-04-23 12:54
hcjiaozhi
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2010-10-11
收藏
得分:0 
再次感谢azzbcc版主!!
我的算法比较笨,不知哪位高手有更好更快的算法!请分享,先谢谢了!

[ 本帖最后由 hcjiaozhi 于 2013-4-23 20:00 编辑 ]
2013-04-23 12:59
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
你的代码局限性特别大(只能算小于10000的),运行时间也够快了,没必要优化了吧

可以把主函数的循环这样写

for(i=101;i<=10000;i += 2)


[fly]存在即是合理[/fly]
2013-04-23 13:15
hcjiaozhi
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2010-10-11
收藏
得分:0 
回复 5楼 azzbcc
是啊,若能更灵活些就好了!比如,不受<10000的限制(我的代码只能算10000以内的)。希望找到实现我说的三个条件的更好方法(数值范围可更大些)!
感谢版主azzbcc赐教!

[ 本帖最后由 hcjiaozhi 于 2013-4-23 13:22 编辑 ]
2013-04-23 13:18
hcjiaozhi
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2010-10-11
收藏
得分:0 
关键问题就是“找出更好的判断超级素数、逆向超级素数、金蝉素数算法”
2013-04-23 13:31
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
不想敲了,给你一个思路,这个数的每一位必然是2,3,5,7之一

把它按位存入数组 a,并用a[0]存储长度,例如12345: 5 1 2 3 4 5

写一个函数判断数组中从第 a位到第 b位组成的数是不是质数


[fly]存在即是合理[/fly]
2013-04-23 19:16
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
另外素数的判断也可以优化,先生成足够长的质数表,再用质数表中的质数对该数取余。

理论就不证明了,以前写的实例你看看
程序代码:
int ss[1230] = {2, 3, 5, 7, 11, 13, 17, 19};

void Init()
{    //10000以内质数表
    int i, j, k = 8, temp;
    for (i = 23;k != 1230;i += 2)
    {
        temp = (int)sqrt(i);
        for (j = 0;ss[j] <= temp;++j)
        {
            if (i % ss[j])    continue;
            break;
        }
        if (ss[j] <= temp)    continue;
        ss[k++] = i;
    }
}
int isprime(int n)
{
    int i;

    for (i = 0;ss[i] * ss[i] <= n;++i)
    {
        if (0 == n % ss[i])    return 0;
    }
    return 1;
}


可以比较快的判断 1亿以内 某任意数是否为质数


[fly]存在即是合理[/fly]
2013-04-23 19:21
hcjiaozhi
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2010-10-11
收藏
得分:0 
8楼、9楼提出的思路很好很实用!可以结贴了!再次感谢azzbcc版主!!
2013-04-23 19:53
快速回复:有关素数的综合运用问题
数据加载中...
 
   



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

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