接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。 Output 对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
3 1 100 2 2 3 19
Case #1: 14 Case #2: 1 Case #3: 4
第一次的代码 是逐次对a到b之间的数进行判断 超时(a=1 b=1000000 要循环至少1000000万次,并且还有内部循环) 代码如下:
- #include<iostream>
- using namespace std;
- bool sushu(int n)
- {
- if(n==1) return 0;
- else if(n==2) return 1;
- else
- {
- for(int i=2;i*i<=n;i++)
- if(n%i==0) return 0;
- }
- return 1;
- }
- int main()
- {
- int i,n,sum,a,b,num;
- cin>>n;
- for(int j=1;j<=n;j++)
- {
- num=0;
- cin>>a>>b;
- for(i=a;i<=b;i++)
- {
- sum=0;
- if(sushu(i))
- {
- int flag=i;
- while(flag)
- {
- sum+=flag%10;
- flag/=10;
- }
- if(sushu(sum))
- {
- num++;
- }
- }
- }
- cout<<"Case #"<<j<<": "<<num<<endl;
- }
- return 0;
- }
第二次更改后想着先把1到1000000之间的美素数找出来之后放到vector数组中,然后对其中的数进行是否在a,b范围内进行判断 又一次超时 代码如下:
- #include<iostream>
- #include<vector>
- using namespace std;
- int sushu(int n)
- {
- if(n==1) return 0;
- else if(n==2) return 1;
- else
- {
- for(int i=2;i*i<=n;i++)
- if(n%i==0) return 0;
- }
- return 1;
- }
- int main()
- {
- int i,n,sum,a,b,num,k,flag;
- vector<int>s;
- for(k=1;k<=1000000;k++)
- {
- sum=0;
- if(sushu(k))
- {
- int flag=k;
- while(flag)
- {
- sum+=flag%10;
- flag/=10;
- }
- if(sushu(sum))
- s.push_back(k);
- }
- }
- cin>>n;
- for(int j=1;j<=n;j++)
- {
- num=0;
- cin>>a>>b;
- for(i=0;i<=s.size();i++)
- {
- if(s[i]>=a && s[i]<=b)
- num++;
- }
- cout<<"Case #"<<j<<": "<<num<<endl;
- }
- return 0;
- }
在经过大佬的指点后,用了数组标记,只用进行一次1到1000000之间的for循环 就可以直接输出a到b之间的美素数
代码如下:
- #include<iostream>
- #include<vector>
- using namespace std;
- int dis[1000005]={0};
- int sushu(int n)
- {
- if(n==1) return 0;
- else if(n==2) return 1;
- else
- {
- for(int i=2;i*i<=n;i++)
- if(n%i==0) return 0;
- }
- return 1;
- }
- int main()
- {
- int i,n,a,b,sum;
- for(i=2;i<=1000000;i++)
- {
- sum=0;
- dis[i]=dis[i-1];//继承上一位标记数组元素的数
- if(sushu(i))
- {
- int flag=i;//不要对i直接进行操作 把i赋给flag后再进行改变
- while(flag)//对flag进行拆分
- {
- sum+=flag%10;
- flag/=10;
- }
- if(sushu(sum))
- dis[i]++;//继承之后判断是否符合美素数的判定 符合的话dis[i]++
- }
- }
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>a>>b;
- cout<<"Case #"<<i<<": "<<dis[b]-dis[a-1]<<endl;
- }
- return 0;
- }
素数打表应该也能解决本题 就是定义一个bool类型的数组判断1到1000000之间哪些是素数 是的话标记成1 否则标记成0