合数分解.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define MAX_N 20
  5. // 函数:检查一个数是否是素数
  6. bool is_prime(int n) {
  7. if (n <= 1) return false;
  8. if (n == 2) return true;
  9. if (n % 2 == 0) return false;
  10. int i;
  11. for (i = 3; i * i <= n; i += 2) {
  12. if (n % i == 0) return false;
  13. }
  14. return true;
  15. }
  16. // 函数:对一个数进行质因数分解,并将结果存入集合
  17. void factorize(int n, int* primes, int* prime_count) {
  18. int i;
  19. for (i = 2; i * i <= n; i++) {
  20. if (n % i == 0) {
  21. while (n % i == 0) {
  22. n /= i;
  23. }
  24. primes[(*prime_count)++] = i;
  25. }
  26. }
  27. if (n > 1) {
  28. primes[(*prime_count)++] = n;
  29. }
  30. }
  31. // 函数:对集合中的质因数进行去重
  32. void remove_duplicates(int* primes, int* prime_count) {
  33. bool unique[MAX_N * 20] = {0};
  34. int temp[MAX_N * 20];
  35. int temp_count = 0;
  36. int i;
  37. for (i = 0; i < *prime_count; i++) {
  38. if (!unique[primes[i]]) {
  39. unique[primes[i]] = true;
  40. temp[temp_count++] = primes[i];
  41. }
  42. }
  43. for (i = 0; i < temp_count; i++) {
  44. primes[i] = temp[i];
  45. }
  46. *prime_count = temp_count;
  47. }
  48. // 函数:比较两个整数的比较器,用于qsort函数
  49. int compare(const void* a, const void* b) {
  50. return (*(int*)a - *(int*)b);
  51. }
  52. int main() {
  53. int n;
  54. scanf("%d", &n);
  55. int i;
  56. int numbers[MAX_N];
  57. for (i = 0; i < n; i++) {
  58. scanf("%d", &numbers[i]);
  59. }
  60. int primes[MAX_N * 20];
  61. int prime_count = 0;
  62. for (i = 0; i < n; i++) {
  63. factorize(numbers[i], primes, &prime_count);
  64. }
  65. remove_duplicates(primes, &prime_count);
  66. qsort(primes, prime_count, sizeof(int), compare);
  67. for (i = 0; i < prime_count; i++) {
  68. printf("%d ", primes[i]);
  69. }
  70. printf("\n");
  71. return 0;
  72. }