• 质数判定与质数表的求解


    866. 试除法判定质数

    给定 n

    个正整数 ai

    ,判定每个数是否是质数。

    输入格式

    第一行包含整数 n

    接下来 n

    行,每行包含一个正整数 ai

    输出格式

    共 n

    行,其中第 i 行输出第 i 个正整数 ai

    是否为质数,是则输出 Yes,否则输出 No

    数据范围

    1≤n≤100

    ,
    1≤ai≤231−1

    输入样例:

    1. 2
    2. 2
    3. 6

    输出样例:

    1. Yes
    2. No

     

    代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. bool Is_primer(int val)
    6. {
    7. if(val<2)
    8. return false;
    9. for(int i=2;i<=val/i;++i)
    10. if(val%i==0)
    11. return false;
    12. return true;
    13. }
    14. int main()
    15. {
    16. int n;
    17. cin >> n;
    18. while(n--)
    19. {
    20. int val;
    21. cin >> val;
    22. if(Is_primer(val))
    23. cout << "Yes\n";
    24. else
    25. cout << "No\n";
    26. }
    27. return 0;
    28. }

    867. 分解质因数

    给定 n

    个正整数 ai

    ,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

    输入格式

    第一行包含整数 n

    接下来 n

    行,每行包含一个正整数 ai

    输出格式

    对于每个正整数 ai

    ,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。

    每个正整数的质因数全部输出完毕后,输出一个空行。

    数据范围

    1≤n≤100

    ,
    2≤ai≤2×109

    输入样例:

    1. 2
    2. 6
    3. 8

    输出样例:

    1. 2 1
    2. 3 1
    3. 2 3

    coding:

    1. #include
    2. #include
    3. using namespace std;
    4. map<int,int> get_primer_factor(int val)
    5. {
    6. map<int,int> mp;
    7. for(int i=2;i<=val/i;++i)
    8. if(val%i==0)
    9. {
    10. while(val%i==0)
    11. {
    12. mp[i]++;
    13. val/=i;
    14. }
    15. }
    16. if(val>1)
    17. mp[val]=1;
    18. return mp;
    19. }
    20. int main()
    21. {
    22. int n;
    23. cin >> n;
    24. while (n -- )
    25. {
    26. int val;
    27. cin >> val;
    28. map<int,int> mp=get_primer_factor(val);
    29. for(auto a:mp)
    30. cout << a.first << ' ' << a.second << endl;
    31. cout << endl;
    32. }
    33. return 0;
    34. }

    868. 筛质数

    给定一个正整数 n

    ,请你求出 1∼n

    中质数的个数。

    输入格式

    共一行,包含整数 n

    输出格式

    共一行,包含一个整数,表示 1∼n

    中质数的个数。

    数据范围

    1≤n≤106

    输入样例:

    8
    

    输出样例:

    4
    

    coding:

    coding first: 埃氏筛法:O(n*loglogn)

    1. //coding first: 埃氏筛法:
    2. #include
    3. using namespace std;
    4. const int N = 1e6+10;
    5. int p[N],num=0;
    6. bool hs[N]={0};
    7. void get_primer_table(int val)
    8. {
    9. for(int i=2;i<=val;++i)
    10. {
    11. if(hs[i]==0)
    12. {
    13. p[num++]=i;
    14. for(int j=i+i;j<=val;j+=i)
    15. hs[j]=1;
    16. }
    17. }
    18. }
    19. int main()
    20. {
    21. int n;
    22. cin >> n;
    23. get_primer_table(n);
    24. cout << num << endl;
    25. return 0;
    26. }

    coding second:欧拉筛法,线性筛法:O(n)

     * 如果i是素数,那么j==num-1的时候,一定会退出循环;
     * 如果i不是素数,那么j  * 所以for循环的判断条件不用加上j  * 至于为什么会加上i*p[j]<=n,原因是让p[j]*i的值不超过n,
     * 以使hs数组不越界。

    1. //coding second:欧拉筛法,线性筛法
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N = 1e6+10;
    7. int p[N] , num=0;
    8. bool hs[N]={0};
    9. /**
    10. * 如果i是素数,那么j==num-1的时候,一定会退出循环;
    11. * 如果i不是素数,那么j
    12. * 所以for循环的判断条件不用加上j
    13. * 至于为什么会加上i*p[j]<=n,原因是让p[j]*i的值不超过n,
    14. * 以使hs数组不越界。
    15. */
    16. void get_primers(int n)
    17. {
    18. for(int i=2;i<=n;++i)
    19. {
    20. if(!hs[i]) p[num++]=i;
    21. for(int j=0;p[j]<=n/i;++j)
    22. {
    23. hs[p[j]*i]=1;
    24. if(i%p[j]==0)
    25. break;
    26. }
    27. }
    28. }
    29. int main()
    30. {
    31. int n;
    32. cin >> n;
    33. get_primers(n);
    34. cout << num << endl;
    35. return 0;
    36. }

  • 相关阅读:
    使用Docker安装MySQL5.7.36
    Linux磁盘不足问题定位及解决
    Python中连接池的分析和应用
    【hcie-cloud】【1】华为云Stack解决方案介绍、华为文档获取方式 【上】
    背靠TON公链的Notcoin游戏项目,能否杀出GameFi的红海?
    服装展示服务预约小程序的内容如何
    leetcode做题笔记138. 复制带随机指针的链表
    二叉树最大路径和问题
    Revit SDK 介绍:CreateAirHandler 创建户式风管机
    mac日历与iphone日历不无法同步问题
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/126212960