码迷,mamicode.com
首页 > 其他好文 > 详细

三 数论的编程实验

时间:2016-05-31 15:52:13      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

算法竞赛中围绕数论三个重要问题

  • 素数运算

  • 求解不定方程和同余房程

  • 积性函数的应用

1.素数运算实验范例

  • 1).计算[2,n]区间中所有素数

  • 2) 大整数素数测试

1.1 使用筛法生成[2,n]区间中所有素数

a. 最简单之埃拉托斯特尼筛法
思想:辅助数组做筛子,递增搜索筛子中最小数,把被搜索数的倍数从筛中去掉,最后留下的数字是素数
实现代码:
  1. #include <iostream>
  2. #define MAXN 50005
  3. using namespace std;
  4. bool u[MAXN]; //辅助数组做筛子
  5. int su[MAXN]; //素数集合
  6. void SieveOfEratosthenes(int n)
  7. {
  8. int i,j,num=0;
  9. for(i=2;i<=n;i++)
  10. {
  11. u[i]=true;
  12. }
  13. for(i=2;i<=n;i++)
  14. {
  15. su[i]=true;
  16. }
  17. for(i=2;i<=n;i++)
  18. {
  19. if(u[i])
  20. {
  21. for(j=2;j*i<=n;j++)
  22. {
  23. u[j*i]=false;
  24. }
  25. }
  26. }
  27. for(i=2;i<=n;i++)
  28. {
  29. if(u[i])
  30. {
  31. su[num++]=i;
  32. }
  33. }
  34. }
  35. // Test
  36. int main()
  37. {
  38. SieveOfEratosthenes(100);
  39. for(int i=0;i<=100;i++)
  40. {
  41. if(su[i]!=0&&su[i]!=1)
  42. cout<<su[i]<<endl;
  43. }
  44. return 0;
  45. }
时间复杂度:O(n*long(long n))
b.加一点优化就是欧拉筛法
思想:埃氏筛法中,每一个合数重复计算,欧拉筛法就是优化到每一个合数仅算一次筛掉,优化算法
实现代码:
  1. #define MAXN 50005
  2. bool u[MAXN]; //辅助数组做筛子
  3. int su[MAXN]; //素数集合
  4. void SieveofEuler(int n)
  5. {
  6. int i,j,num=0;
  7. memset(u,true,sizeof(u));
  8. for(i=2;i<=n;i++)
  9. {
  10. if(u[i])
  11. {
  12. su[num++]=i;
  13. }
  14. for(j=0;j<=num;j++)
  15. {
  16. if(i*su[j]>n)
  17. {
  18. break;
  19. }
  20. u[i*su[j]]=false;
  21. if(i%su[j]==0)
  22. {
  23. break;
  24. }
  25. }
  26. }
  27. }
  28. //Test
  29. int main()
  30. {
  31. SieveofEuler(100);
  32. for(int i=0;i<=100;i++)
  33. {
  34. if(su[i]!=0)
  35. cout<<su[i]<<endl;
  36. }
  37. return 0;
  38. }
时间复杂度:O(n)




三 数论的编程实验

标签:

原文地址:http://www.cnblogs.com/xzmds/p/5545900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!