• 【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现



    ●素数

            素数又称为质数,它指在一个大于1的自然数中,除了1和它自身外,没法被其他自然数整除的数。比1大,但不是素数的数称为合数。0和1既不是素数,也不是合数。因为素数的分布没有明显的规律,所以在程序中一般根据素数的定义来判断该数是否为素数。例如哥德巴赫猜想:哥德巴赫通过大量的数据猜测,所有不小于6的偶数,都可以表示为两个奇素数之和。后人将其称之为“1+1”。并且,对于每个不小于9的奇数,都可以表示为三个奇素数之和。

    1. #include
    2. using namespace std;
    3. class isprime {
    4. public:
    5. void isprime1()
    6. {
    7. int k=0;
    8. for (int i = a; i <= b; i++)
    9. {
    10. if(i==2||i==3)
    11. {
    12. k = 1;
    13. }
    14. for (int j = 2; j <= i/2 ; j++)
    15. {
    16. if (i % j == 0)
    17. {
    18. k = 0;
    19. break;
    20. }
    21. else
    22. {
    23. k = 1;
    24. }
    25. }
    26. if (k == 1)
    27. {
    28. cout << i << " ";
    29. }
    30. }
    31. }
    32. int a;
    33. int b;
    34. };
    35. void text()
    36. {
    37. isprime ip;
    38. cout << "请输入一个区间范围:" << endl;
    39. cin >> ip.a >> ip.b;
    40. cout << "该区间范围内的素数有:" << endl;
    41. ip.isprime1();
    42. }
    43. int main()
    44. {
    45. text();
    46. }


     ●最大公约数

            最大公约数和最小公倍数是我们频繁接触的一对数。如果有一个自然数m能被自然数n整除,则称m为n的倍数,b为a的约数。多个自然数公共的约数,叫做这几个自然数的公约数。而公约数中最大的一个,就称为这几个自然数的最大公约数。

             计算两个自然数最大公约数的传统算法就是欧几里得的辗转相除法,对于要对多个自然数寻找其最大公约数可以通过多次辗转相除法得到,具体步骤如下:

    ①已知两自然数m、n,假设m>n;

    ②计算m除以n,将得到的余数记为r;

    ③如果r=0,则n为求得的最大公约数,否则执行下面一步;

    ④将n的值保存到m中,将r的值保存到n中,重复执行步骤②和③,直到r=0,便得到最大公约数;

    1. #include
    2. using namespace std;
    3. class max_public_number {
    4. public:
    5. int max_public_number1()
    6. {
    7. int temp;
    8. if (m > n){
    9. m = m;
    10. n = n;
    11. }
    12. else{
    13. temp = m;
    14. m = n;
    15. n = temp;
    16. }
    17. r = m % n;
    18. while (r!= 0) //辗转相除法
    19. {
    20. m = n;
    21. n = r;
    22. r = m % n;
    23. }
    24. return n;
    25. }
    26. void showresult()
    27. {
    28. cout << n << endl;
    29. }
    30. int m;
    31. int n;
    32. int r;
    33. };
    34. void text()
    35. {
    36. max_public_number mpn;
    37. cout << "请输入两个数:" << endl;
    38. cin >> mpn.m>>mpn.n;
    39. cout << "这两个数的最大公约数为:" << endl;
    40. mpn.max_public_number1();
    41. mpn.showresult();
    42. }
    43. int main()
    44. {
    45. text();
    46. }


     ●完全数

            当一个自然数的所有真因子之和等于该自然数,那么该自然数便是完全数(完全数的尾数都是6或8)。

     完全数的特殊性质:

    1.每个完全数都可以表示成连续自然数的和

     2. 每个完全数都是调和级数

    3.每个完全数都可以表示为2的一些连续正整数次幂之和

    4.除6之外的完全数都可以表示成连续的奇立方之和

    1. #include
    2. using namespace std;
    3. class perfectnum {
    4. public:
    5. void perfectnum1()
    6. {
    7. for (int i = 1; i < range; i++)
    8. {
    9. long num = i;
    10. long sum = num; //这里将num赋给sum,在下面num去判断寻找因子,sum去进行逐渐判断是否为完全数
    11. long count = 0; //记数组下标数
    12. for (int j = 1; j < num; j++)
    13. {
    14. if (num % j == 0) //判断j是否为num的真因子
    15. {
    16. p[count++] = j; //若是因子,我们将其记录在数组内
    17. sum -= j; //对sum进行逐减因子
    18. }
    19. }
    20. if (sum == 0) //如果sum能被因子逐减为0,则说明他为完全数
    21. {
    22. cout << "完全数:" << num << endl;
    23. for(int k=0;k
    24. {
    25. cout << p[k] << " "; //输出每个完全数的因子
    26. }
    27. cout << endl;
    28. }
    29. }
    30. }
    31. long p[100];
    32. int range;
    33. };
    34. void text()
    35. {
    36. perfectnum pn;
    37. cout << "请输入一个范围:" << endl;
    38. cin >> pn.range;
    39. cout << "该范围内的完全数为:" << endl;
    40. pn.perfectnum1();
    41. }
    42. int main()
    43. {
    44. text();
    45. }


     ●亲密数

            如果整数a的因子和等于整数b,整数b的因子和等于整数a,因子包括1但不包括本身,且a不等于b,则称a,b为亲密数对。

    比如,220的因子为1、2、4、5、10、11、20、22、44、55、110;284的因子为1、2、4、71、142。而220的因子和1+2+4+5+10+11+20+22+44+55+110等于284;284的因子和1+2+4+71+142等于220,并且因子包括1但不包括本身,220不等于284,所以这两数为亲密数对。

    1. #include
    2. using namespace std;
    3. class friendnum {
    4. public:
    5. void friendnum1(int i)
    6. {
    7. for(int size=0;size<100;size++) //每次的调用需将数组重复置空
    8. {
    9. a[size] = b[size] = 0;
    10. }
    11. count = 0; //记录数组下标
    12. int sum_1 = 0;
    13. for (int j = 1; j < i / 2 + 1; j++) //求数i的因子
    14. {
    15. if (i % j == 0) //i能被j整除,j为因子
    16. {
    17. a[count++] = j; //保存因子到数组a中
    18. sum_1 += j; //累加因子之和
    19. }
    20. }
    21. count = 0; //置零,重新记录数组下标
    22. int sum_2 = 0;
    23. for (int k = 1; k < sum_1 / 2 + 1; k++) //将数i因子之和sum_1进行因子分解
    24. {
    25. if (sum_1 % k == 0) //sum_1能被k整除
    26. {
    27. b[count++] = k; //保存因子到数组b中
    28. sum_2 += k; //累加因子之和
    29. }
    30. }
    31. if (sum_2 == i && i < sum_1)
    32. {
    33. cout<"与"<"是亲密数," <<"并前两数的因子如下:"<< endl;
    34. count = 0;
    35. while (a[count]!=0)
    36. {
    37. cout << a[count] <<" ";
    38. count++;
    39. }
    40. cout << endl;
    41. count = 0;
    42. while(b[count]!=0)
    43. {
    44. cout << b[count] << " ";
    45. count++;
    46. }
    47. cout << endl;
    48. }
    49. }
    50. int a[100];
    51. int b[100];
    52. int range;
    53. int count;
    54. };
    55. void text()
    56. {
    57. friendnum fn;
    58. cout << "请输入一个范围:" << endl;
    59. cin >> fn.range;
    60. cout << "该范围内的亲密数为:" << endl;
    61. for (int a = 1; a <= fn.range; a++)
    62. {
    63. fn.friendnum1(a);
    64. }
    65. }
    66. int main()
    67. {
    68. text();
    69. }


  • 相关阅读:
    DPDK ACL算法介绍(二)
    动态规划45(Leetcode790多米诺和拖米诺平铺)
    为什么要用 Tair 来服务低延时场景 - 从购物车升级说起
    gRPC之API详解
    8月6日Spring Boot学习笔记
    notepad++配置python2环境
    使用DataSecurity Plus可以快速检测威胁并自动响应事件
    Kubernetes部署集群碰到的问题解决
    Jetson系列设置Python脚本开机自启
    CopyOnWriteArrayList源码分析
  • 原文地址:https://blog.csdn.net/zzc18247189868/article/details/128198888