[day 2]判断素数_筛选法2014.7.14

第一个问题是struct总是忘记加分号...

今天语法问题就少了很多的嘛

OMLDGG!!!又是两个小时过去了改起代码完全停不住手好嘛TOT

//Method_2_Eratosthenes.cpp
//判断a到b范围内的素数(包含上下界)
//从小到大扣掉素数的倍数
//Input a,b (正整数)
//Output q,w,e,...(范围内素数,逗号分格,每5个一行)

#include <iostream>
#include <cmath>
using namespace std;

struct prime{
	int value;//要判断数的值
	bool flag;//1素数,0合数
};

int main(){
	int a,b;//下界,上界
	cin >> a;
	cin >> b;
	if(a < 2){
        a = 2;//去掉必不为素数的0,1
	}

	//============创建数组============
	int length = (b-a)/2+1;//数组长度
	struct prime Prime[length];
	if(a%2 == 0){
        int i = 0;//数组下标
        if(a == 2){
            Prime[i].value = 2;
            Prime[i].flag = 1;
            i++;
        }
        for(int j = a+1;j <= b;j = j+2){
            Prime[i].value = j;
            Prime[i].flag = 1;
            i++;
        }
		if(i = length-1)
			Prime[i].flag = 0;
	}
	else{
        int i = 0;//数组下标
        for(int j = a;j <= b;j = j+2){
            Prime[i].value = j;
            Prime[i].flag = 1;
            i++;
        }
		if(i = length-1)
			Prime[i].flag = 0;
	}

	//=========判断素数并抠去他们的倍数==========
	
	int b_half = b/2;
	for(int x = 0; Prime[x].value < b_half; x++){//筛出sqrt(b)内的素数
        for(int i = 2;i <= sqrt(Prime[x].value);i++){
            if(Prime[x].value%i == 0){
			     Prime[x].flag = 0;
		    }
		    else{
                for(int j = 3*Prime[x].value, y = x+Prime[x].value; j <= b; j = j + 2*Prime[x].value,y = y+Prime[x].value){
					if(Prime[y].value == j){
						Prime[y].flag = 0;//去掉倍数
					}
                }
		    }
	    }
	}

	//========终于可以显示啦==========

	int judge = 1;//判断换行
	for(int x = 0; x < length; x++){
	    if(Prime[x].flag){
            cout << Prime[x].value << ',';
            judge++;
	    }
	    if(judge%5 == 0)
	        cout << endl;
	}
	
	return 0;
}

还有一个逻辑问题没有改, 是关于筛选参数的设定的,好像还是应该分开两个循环, 先找素数, 再筛选, 不然下界大的话就只判断了前半部分素数

然后换行有点问题, 初值给0应该

明天继续....为什么要手贱的把题目设置成上下界....像大家学习只输入上界不好嘛....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值