HDU-4548 美素数


Input第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。 
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
Output对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。 

每组数据占一行,具体输出格式参见样例。

Sample Input

3
1 100
2 2
3 19

Sample Output

Case #1: 14
Case #2: 1
Case #3: 4

第一次的代码  是逐次对a到b之间的数进行判断  超时(a=1 b=1000000  要循环至少1000000万次,并且还有内部循环) 代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. bool sushu(int n)
  4. {
  5. if(n==1) return 0;
  6. else if(n==2) return 1;
  7. else
  8. {
  9. for(int i=2;i*i<=n;i++)
  10. if(n%i==0) return 0;
  11. }
  12. return 1;
  13. }
  14. int main()
  15. {
  16. int i,n,sum,a,b,num;
  17. cin>>n;
  18. for(int j=1;j<=n;j++)
  19. {
  20. num=0;
  21. cin>>a>>b;
  22. for(i=a;i<=b;i++)
  23. {
  24. sum=0;
  25. if(sushu(i))
  26. {
  27. int flag=i;
  28. while(flag)
  29. {
  30. sum+=flag%10;
  31. flag/=10;
  32. }
  33. if(sushu(sum))
  34. {
  35. num++;
  36. }
  37. }
  38. }
  39. cout<<"Case #"<<j<<": "<<num<<endl;
  40. }
  41. return 0;
  42. }

第二次更改后想着先把1到1000000之间的美素数找出来之后放到vector数组中,然后对其中的数进行是否在a,b范围内进行判断  又一次超时 代码如下:

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int sushu(int n)
  5. {
  6. if(n==1) return 0;
  7. else if(n==2) return 1;
  8. else
  9. {
  10. for(int i=2;i*i<=n;i++)
  11. if(n%i==0) return 0;
  12. }
  13. return 1;
  14. }
  15. int main()
  16. {
  17. int i,n,sum,a,b,num,k,flag;
  18. vector<int>s;
  19. for(k=1;k<=1000000;k++)
  20. {
  21. sum=0;
  22. if(sushu(k))
  23. {
  24. int flag=k;
  25. while(flag)
  26. {
  27. sum+=flag%10;
  28. flag/=10;
  29. }
  30. if(sushu(sum))
  31. s.push_back(k);
  32. }
  33. }
  34. cin>>n;
  35. for(int j=1;j<=n;j++)
  36. {
  37. num=0;
  38. cin>>a>>b;
  39. for(i=0;i<=s.size();i++)
  40. {
  41. if(s[i]>=a && s[i]<=b)
  42. num++;
  43. }
  44. cout<<"Case #"<<j<<": "<<num<<endl;
  45. }
  46. return 0;
  47. }

在经过大佬的指点后,用了数组标记,只用进行一次1到1000000之间的for循环  就可以直接输出a到b之间的美素数

代码如下:

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int dis[1000005]={0};
  5. int sushu(int n)
  6. {
  7. if(n==1) return 0;
  8. else if(n==2) return 1;
  9. else
  10. {
  11. for(int i=2;i*i<=n;i++)
  12. if(n%i==0) return 0;
  13. }
  14. return 1;
  15. }
  16. int main()
  17. {
  18. int i,n,a,b,sum;
  19. for(i=2;i<=1000000;i++)
  20. {
  21. sum=0;
  22. dis[i]=dis[i-1];//继承上一位标记数组元素的数
  23. if(sushu(i))
  24. {
  25. int flag=i;//不要对i直接进行操作 把i赋给flag后再进行改变
  26. while(flag)//对flag进行拆分
  27. {
  28. sum+=flag%10;
  29. flag/=10;
  30. }
  31. if(sushu(sum))
  32. dis[i]++;//继承之后判断是否符合美素数的判定 符合的话dis[i]++
  33. }
  34. }
  35. cin>>n;
  36. for(i=1;i<=n;i++)
  37. {
  38. cin>>a>>b;
  39. cout<<"Case #"<<i<<": "<<dis[b]-dis[a-1]<<endl;
  40. }
  41. return 0;
  42. }


素数打表应该也能解决本题  就是定义一个bool类型的数组判断1到1000000之间哪些是素数 是的话标记成1  否则标记成0

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页