fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. // 這個函數用來進行質因數分解
  5. void primeFactorization(unsigned long long n) {
  6. int first = 1; // 用來控制輸出格式,避免第一個因數前有乘號 (*)
  7.  
  8. // 處理2這個特殊質數
  9. int count = 0;
  10. while (n % 2 == 0) { // 檢查n能否被2整除
  11. n = n / 2;
  12. count++; // 記錄2的次方
  13. }
  14. if (count > 0) {
  15. if (!first) { // 如果 first 為 0(表示已經輸出過質因數),才輸出乘號 (*)
  16. printf(" * ");
  17. }
  18. printf("2"); // 輸出質因數2
  19. if (count > 1) {
  20. printf("^%d", count); // 只有當次方大於1時才輸出次方
  21. }
  22. first = 0; // 設定 first 為 0,表示已經輸出過質因數,接下來再輸出需要加乘號
  23. }
  24.  
  25. // 從3開始,處理其他質數,這裡只檢查奇數
  26. for (unsigned long long i = 3; i <= sqrt(n); i += 2) {
  27. count = 0;
  28. while (n % i == 0) { // 檢查n能否被i整除
  29. n = n / i;
  30. count++; // 記錄i的次方
  31. }
  32. if (count > 0) {
  33. if (!first) { // 如果 first 為 0(表示已經輸出過質因數),才輸出乘號 (*)
  34. printf(" * ");
  35. }
  36. printf("%llu", i); // 輸出質因數i
  37. if (count > 1) {
  38. printf("^%d", count); // 只有當次方大於1時才輸出次方
  39. }
  40. first = 0; // 設定 first 為 0,表示已經輸出過質因數
  41. }
  42. }
  43.  
  44. // 如果n大於1,表示n本身就是一個質數,直接輸出
  45. if (n > 1) {
  46. if (!first) { // 如果 first 為 0(表示已經輸出過質因數),才輸出乘號 (*)
  47. printf(" * ");
  48. }
  49. printf("%llu", n); // n本身就是質數,因為沒有次方,直接輸出
  50. }
  51.  
  52. printf("\n"); // 結束時換行
  53. }
  54.  
  55. int main() {
  56. unsigned long long n;
  57.  
  58. // 不斷讀取輸入的數字,直到沒有更多的輸入
  59. while (scanf("%llu", &n) != EOF) {
  60. primeFactorization(n); // 調用質因數分解函數
  61. }
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0.01s 5288KB
stdin
20
stdout
2^2 * 5