| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1172 人关注过本帖
标题:看时(似)很难的问题!
只看楼主 加入收藏
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
收藏
得分:0 
还有就是用数组不太好定维数,当你无法知道最大的数个数时。你的更简练,值的学习。
2012-06-07 10:03
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用cuijunchao在2012-6-7 10:03:38的发言:

还有就是用数组不太好定维数,当你无法知道最大的数个数时。你的更简练,值的学习。

你是在跟版主说话么~
2012-06-07 10:17
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 11楼 cuijunchao
我想你说的是数组的长度吧。这个问题不难确定一个上限。

第一位的取值(从左向右数)只能是2、3、5、7。之后每一位的取值只可能是1、3、7、9(排除能被2、5整除的数)。

所以对于8位数来说,最多只有4^8 = 64K 这么多个可能的数(事实上只有5个)。对于现在的内存容量来说,这不算什么,我会直接开这么大的。

重剑无锋,大巧不工
2012-06-07 10:26
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 7楼 beyondyf
程序代码:
int is_prime(int a)
{
    int i, b;
    b = (int)sqrt(a);
    for(i = 3; i <= b && a % i; i += 2); // 这是否应该是i++而不是 i += 2?
    return i > b;
}

My life is brilliant
2012-06-07 10:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 14楼 lz1091914999
没必要。所有的偶数中,只有2是素数,其它都是合数。

is_prime的参数a因为确定是奇数,所以我就不再判断它是否能被2整除。

而一个奇数是不能被偶数整除的,所以我跳过对偶除数的判断。

重剑无锋,大巧不工
2012-06-07 10:45
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用lz1091914999在2012-6-7 10:35:03的发言:

int is_prime(int a)
{
    int i, b;
    b = (int)sqrt(a);
    for(i = 3; i <= b && a % i; i += 2); // 这是否应该是i++而不是 i += 2?
    return i > b;
}

同意L版,应该是i++吧
2012-06-07 10:50
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
回复 15楼 beyondyf
要是参数确定为奇数那就没问题了
2012-06-07 10:51
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
即使做一个通用的质数判断,我也只在函数开头加一句 if(a % 2 == 0) return 0;

重剑无锋,大巧不工
2012-06-07 10:55
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
我写了个 答案应该没问题 一下子都输出了 如果要分开输出 稍微改下就可以
不知道怎么看 程序的运行时间和CPU的占用率
程序代码:
#include <stdio.h>
#include <math.h>

int is_prime(int a)
{
   int n = (int)sqrt(a);
   int i;

   for (i = 2; i <= n && a % i != 0; i++);
    return i > n;
}

int main(void)
{
    int prime[8][88] = {0};
    int i, j, k, m;
    int N;

    prime[0][0] = 4;
    prime[0][1] = 2;
    prime[0][2] = 3;
    prime[0][3] = 5;
    prime[0][4] = 7;

    printf("Please input N:");
    scanf("%d", &N);

    for (i = 0; i < N - 1; i++)
    {
        m = 1;
        printf("When N = %d :", i + 2);
        for (j = 1; j <= prime[i][0]; j++)                   
            for (k = 1; k <= 9; k += 2)
                if (is_prime(prime[i][j] * 10 + k))
                {
                    prime[i + 1][m++] = prime[i][j] * 10 + k;
                    printf("%d ", prime[i + 1][m - 1]);
                }
                prime[i + 1][0] = m - 1;                   
            puts("");
    }
    return 0;
}

---
图片附件: 游客没有浏览图片的权限,请 登录注册


梅尚程荀
马谭杨奚







                                                       
2012-06-07 11:04
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
收藏
得分:0 
2^8个数感觉还是很大的,一般数组开那么大有点浪费,关键是数组中有大部分内存没有用到。不过版主经念丰富,我要多学习。
2012-06-07 11:05
快速回复:看时(似)很难的问题!
数据加载中...
 
   



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

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