第一个问题是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应该
明天继续....为什么要手贱的把题目设置成上下界....像大家学习只输入上界不好嘛....
[day 2]判断素数_筛选法2014.7.14
最新推荐文章于 2021-05-02 17:25:50 发布