| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6446 人关注过本帖
标题:怎么用筛选法输出100之内的素数?
只看楼主 加入收藏
doofymark
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2010-10-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:13 
怎么用筛选法输出100之内的素数?
首先开头肯定是初始化一个数组,里面是整数1到100。
但是有一个问题我有点不明白。
就是关于筛选法的问题
如果我这样写的话
#include<iostream>
using namespace std;

int main()
{
    int a[100],i,j;
    for(i=0;i<100;i++)
    {a[i]=i+1;}
    for(i=0;i<100;i++)
      {  for(j=2;j<i+1;j++)
            {if(a[i]%j==0) cout<<a[i]<<endl;}}
return 0;}

这样写有一个问题...就是a[i]有可能不止输出一次....比如...a[44]=45,那么当j=5的时候a[44]输出...但是j=9的时候a[44]会再输出一次...
怎么解决这个问题啊?
搜索更多相关主题的帖子: 素数 筛选 输出 
2010-10-19 04:36
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
在if块里写个break;
2010-10-19 08:57
xinyuan54
Rank: 2
等 级:论坛游民
帖 子:10
专家分:17
注 册:2010-10-13
收藏
得分:0 
#include "stdafx.h"
#include<iostream>
using namespace std;

int main()
{
    int a[100],i,j;
    for(i=0;i<100;i++)
    {
        a[i]=i+1;
    }
    for(i=0;i<100;i++)
      {  
          for(j=2;j<i+1;j++)
            {
                if(a[i]%j==0)
                    break;
                if(i==j)
                cout<<a[i]<<endl;
            }
    }   
return 0;
}
2010-10-19 09:00
孙优
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-10-18
收藏
得分:0 
这是用C写的,用VC也能编译,你可以看一下

#include <stdio.h>
void main()
{
    int i,j,a[100]={0},f,n=0;
    for(i=3;i<100;i++)
    {   f=0;
        for(j=2;j<i;j++)
            if(i%j==0)
               f=f+1;
        if(f!=0)
            a[i-1]=i;
    }
    printf("100以内的素数有");
    for(i=0;i<100;i++)
    {
        if(a[i]!=0)
        {
            n=n+1;
            printf("%d ",a[i]);
            
        }
        if(n%10==0)
           printf("\n");
        
}
printf("\n");

}   
2010-10-19 10:16
zfk305
Rank: 2
等 级:论坛游民
帖 子:12
专家分:24
注 册:2010-6-8
收藏
得分:10 
三楼貌似不用加#include "stdafx.h"吧?
2010-10-19 11:24
xinyuan54
Rank: 2
等 级:论坛游民
帖 子:10
专家分:17
注 册:2010-10-13
收藏
得分:0 
回复 5楼 zfk305
我用的是VS2008
每个c++都要那个··
不然编译通不过··
2010-10-19 16:47
xy9293
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2010-10-18
收藏
得分:0 
回复 楼主 doofymark
#include<iostream>
using namespace std;

int main()
{
    int a[100],i,j,o=0;
    for(i=0;i<100;i++)
    {a[i]=i+1;}
    for(i=1;i<100;i++)
      {  for(j=2;j<i+1;j++)
            {if(a[i]%j==0) o=1;}
         if(o==0) cout<<a[i]<<endl;
         o=0;
      }
    return 0;}
可以吗?

[ 本帖最后由 xy9293 于 2010-10-19 17:38 编辑 ]
2010-10-19 17:32
Tveiker
Rank: 2
来 自:湖南省张家界桑植
等 级:论坛游民
帖 子:17
专家分:41
注 册:2010-9-28
收藏
得分:0 
可以标志啊,比如用b[100]来标示a[100]的每个数是否输出,比如a[44]已输出则b[44]=1,否则b[44]=0;
良好的编程习惯很重要
#include<iostream>
#include<iomanip>
using namespace std;

int main(){
    int a[100],i,j;
    int b[100],count=0;
    for(i=0;i<100;i++){
        a[i]=i+1;
        b[i]=0;    //使数组b的每个元素为0,表示还未输出
    }
    cout<<"被筛出的非素数依次是:"<<endl;
    for(i=0;i<100;i++){  
        for(j=2;j<i+1;j++){
            if(a[i]%j==0&&b[i]==0) {
                cout<<setw(3)<<setiosflags(ios::right)<<a[i]<<" ";//加入的代码是设置输出格式的宽3右对齐
                count++;
                b[i]=1;
                if(count%10==0)    //每行10个数   
                    cout<<endl;
            }
        }
    }
    cout<<endl;
    return 0;
}

2010-10-19 22:50
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:10 
筛法筛几亿以内的质数也就是一会的事。你可以先筛好了再输出嘛。
这个程序筛了10亿以内的素数,但速度也不太快,我机子上跑大约要一分半左右的时间。它没有输出,但确实是筛了,如果你想看它筛的结果,就把有注释的地方改成 1 就行了。但要小心使用,它会输出一个 1G 左右的文本文件,跑下来要花大约二分钟左右的时间。
嫌大就把那个 N 改小一点。
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define N 1000000000

int main(int argc, const char *argv[])
{
    int i, j;
    FILE *f = fopen("prime_list.txt", "w");
    if (!f) { perror("fopen"); exit(1); }
    char *flag = (char *)calloc(N, sizeof(char));

    for(i = 2; i < N; ++i) {
        if(flag[i]) continue;
        for(j = 2*i; j < N; j += i)
            flag[j] = 1;
    }

#if 0        // change this to 1, to write to file.
    for(j = 0, i = 2; i < N; ++i) {
        if(flag[i] == 0) fprintf(f, "%10d: %d\n", ++j, i);
    }
#endif

    fclose(f);

    return 0;
}

2010-10-19 23:41
doofymark
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2010-10-6
收藏
得分:0 
回复 3楼 xinyuan54
我明白了...if(i==j) cout<<a[i]<<endl;
这样只有j加到最后一项才会输出了...谢谢啦!
2010-10-20 06:21
快速回复:怎么用筛选法输出100之内的素数?
数据加载中...
 
   



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

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