合数分解.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. // 判断一个数是否为素数
  4. bool isPrime(int num) {
  5. if (num <= 1) return false;
  6. if (num <= 3) return true;
  7. if (num % 2 == 0 || num % 3 == 0) return false;
  8. int i;
  9. for (i = 5; i * i <= num; i += 6) {
  10. if (num % i == 0 || num % (i + 2) == 0)
  11. return false;
  12. }
  13. return true;
  14. }
  15. // 打印素数分解结果的最小素数集
  16. void printMinimumPrimeSet(int *compositeNumbers, int numCount) {
  17. // 使用集合来存储最小素数集,利用集合的自动去重和排序特性
  18. bool primeSet[100000] = { false }; // 使用一个足够大的数组来存储素数集合
  19. int maxNum = 0;
  20. // 找出所有的素数因子
  21. int i, k;
  22. for (k = 0; k < numCount; ++k) {
  23. int num = compositeNumbers[k];
  24. if (isPrime(num)) {
  25. primeSet[num] = true;
  26. if (num > maxNum) maxNum = num;
  27. } else {
  28. int factor = 2;
  29. while (num > 1) {
  30. if (isPrime(factor) && num % factor == 0) {
  31. primeSet[factor] = true;
  32. num /= factor;
  33. factor = 2; // 重新从最小素数开始找因子
  34. } else {
  35. factor++;
  36. }
  37. }
  38. if (factor > maxNum) maxNum = factor;
  39. }
  40. }
  41. // 输出最小素数集,按从小到大顺序输出
  42. bool first = true;
  43. for (i = 2; i <= maxNum; ++i) {
  44. if (primeSet[i]) {
  45. if (!first) printf(" ");
  46. printf("%d", i);
  47. first = false;
  48. }
  49. }
  50. printf("\n");
  51. }
  52. int main() {
  53. int numCount;
  54. scanf("%d", &numCount);
  55. int compositeNumbers[20];
  56. int i;
  57. for (i = 0; i < numCount; ++i) {
  58. scanf("%d", &compositeNumbers[i]);
  59. }
  60. printMinimumPrimeSet(compositeNumbers, numCount);
  61. return 0;
  62. }