QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 885|回复: 11

c疑问:怎样显示前n个素数?

[复制链接]
发表于 2004-2-10 21:06:36 | 显示全部楼层 |阅读模式
n由用户输入。
发表于 2004-2-10 21:28:09 | 显示全部楼层
用了一个变量计数啊。计到n就停啊。
回复

使用道具 举报

发表于 2004-2-10 21:29:26 | 显示全部楼层
[code:1]
#include <stdio.h>
#include <math.h>

int is_prime(int i)
{
        int n;
        if(!(i>0))
                return 0;
        for(n=sqrt(i);!(n<2);n--)
        {
                if(0==i%n)
                        return 0;
                else
                        continue;
        }
        return 1;
}

int main(int argc,char *argv[])
{
        int n;
        int i;
        if(argc<2)
        {
                fprintf(stderr,"Err: Parameter err\n");
                exit(-1);
        }
       
        if(!isdigit(argv[1]))
        {
                fprintf(stderr,"Err: Parameter err\n");
                exit(-1);
        }
        n=atoi(argv[1]);
        if(!(n>0))
        {
                fprintf(stderr,"Err: Parameter err\n");
                exit(-1);
        }
        for(i=1;!(i>n);i++)
        {
                if(is_prime(i))
                        printf("%d\n",i);
                else
                        continue;
        }
        exit(0);
}[/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-2-10 23:03:00 | 显示全部楼层
默难老大的实在看不懂(因为我是菜鸟)。我发一个看得我看得懂的。
[code:1]
//primes.h

#include <stdio.h>
#include <stdlib.h>

int  is_prime(int n);

//is_prime.c

#include "primes.h"

int is_prime(int n)
{
    int  k, limit;

    if ( n == 2 )
        return 1;
    if ( n%2 == 0 )
        return 0;
    limit = n/2;
    for ( k = 3; k <=limit; k +=2)
        if ( n % k == 0)
                return 0;
    return n;
}

//main.c

#include "primes.h"

int main(void)
{
    int n, i, k=0;

    printf("您要输入多少?");
    scanf("%d", &n);
    for ( i=2; ;i++)
    {
        if( is_prime(i))
        {
                printf("%10d:",++k);
                printf("%10d\n",i);
                if ( k<n)
                        continue;
                else
                        break;
        }
        else
                continue;
    }
    return 0;
}

[/code:1]
回复

使用道具 举报

发表于 2004-2-11 10:39:29 | 显示全部楼层
它的is_prime,就是判断n是不是质数

从2开始试,直到跟号下n,如果都不能被整出,就是质数

当然这个方法很慢拉,我给你一个快点的吧

[code:1]
#include <vector>
#include <iostream>

using namespace std;

typedef vector<long> num_list_t;
num_list_t        prime_nums;

void find_prime_numbers(num_list_t &prime_nums, long max);

int main(int argc, char *argv[])
{
        num_list_t        num_list;
        int                        max = 0;
       
        while (max != -1) {
                cin >> max;
                find_prime_numbers(num_list, max);
                copy(num_list.begin(), num_list.end(), ostream_iterator<long>(cout, "\n"));
                cout << endl;
                num_list.clear();
        }
        system("pause");
        return 0;
}

void find_prime_numbers(num_list_t &prime_nums, long max)
{
        if (max < 2) return;
        else if (max == 2) prime_nums.push_back(2);
        else {
                bool        *table = new bool[max+1];
               
                memset(table, 1, max+1);
                find_prime_numbers(prime_nums, max / 2);
                for (long i = 0; i < prime_nums.size(); i++) {
                        for (long j = prime_nums[i]; j <= max; j += prime_nums[i])
                                table[j] = false;
                }
               
                for (long k = max/2 + 1; k <= max; k++)
                          if (table[k])
                             prime_nums.push_back(k);               
                delete []table;
        }
}

[/code:1]
回复

使用道具 举报

发表于 2004-2-11 20:17:02 | 显示全部楼层
c做这种东西好像总是很慢
回复

使用道具 举报

发表于 2004-2-11 20:38:39 | 显示全部楼层
[quote:fae95876b7="sdzzg"]c做这种东西好像总是很慢[/quote]

那什么快?
回复

使用道具 举报

发表于 2004-2-11 21:31:39 | 显示全部楼层
ASM……
回复

使用道具 举报

发表于 2004-2-11 22:27:32 | 显示全部楼层
0100011001011001……   
回复

使用道具 举报

发表于 2004-2-11 22:35:32 | 显示全部楼层
[quote:ae89fe0a98="默难"] ASM……[/quote]

...... 果然好快
回复

使用道具 举报

 楼主| 发表于 2004-2-11 22:49:42 | 显示全部楼层
[quote:c7026258c3="sjinny"]0100011001011001……   [/quote]
ASM算什么!!这才是最本质的。
回复

使用道具 举报

发表于 2004-2-11 22:54:01 | 显示全部楼层
[code:1]
              
[/code:1]
哦?这里不能放电信号??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-9 02:20 , Processed in 0.046995 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表