质因子分解

男娘i 2022-04-24 08:48 362阅读 0赞

概念:所谓质因子分解是将一个正整数n写成一个或多个质数的乘积形式。
例如:6=2*3,180=2*2*3*3*5,也可以写成指数形式,例如 180=2^2*3^2*5^1;
你会发现最终会归结到若干个不同素数(质数)的乘积

注意:由于1本身不是素数,因此它没有质因子,下面针对大于1的正整数来说。

这里提供2种质因子分解的代码,可根据要求选择,重点讲解方法(二)
方法(一):

  1. #include <stdio.h>
  2. int main(){
  3. int n; // 用户输入的整数
  4. int i; // 循环标志
  5. printf("输入一个整数:");
  6. scanf("%d",&n);
  7. printf("%d=",n);
  8. // n>=2才执行下面的循环
  9. for(i=2; i<=n; i++){
  10. while(n!=i){
  11. if(n%i==0){
  12. printf("%d*",i);
  13. n=n/i;
  14. }else
  15. break;
  16. }
  17. }
  18. printf("%d\n",n);
  19. return 0;
  20. }

20190420200237138.png

方法(二) :指数形式输出

  1. #include <stdio.h>
  2. #include <math.h>
  3. const int maxn=100001;
  4. //判断是否为素数
  5. bool is_prime(int n){
  6. if(n==1) return false;
  7. int sqr=(int)sqrt(1.0*n);
  8. for(int i=2;i<=sqr;i++){
  9. if(n%i==0) return false;
  10. }
  11. return true;
  12. }
  13. int prime[maxn],pNum=0;
  14. //构建素数表
  15. void Find_prime(){
  16. for(int i=1;i<maxn;i++){
  17. if(is_prime(i)==true){
  18. prime[pNum++]=i;
  19. }
  20. }
  21. }
  22. //存放质因子和个数
  23. struct factor{
  24. int x,count;
  25. }f[10]; //连乘即将超越int上限
  26. int main(){
  27. Find_prime();
  28. int n;
  29. int num=0;//记录质因数个数
  30. scanf("%d",&n);
  31. if(n==1) printf("1=1");//特殊判断
  32. else{
  33. printf("%d=",n);
  34. int sqr=(int)sqrt(1.0*n);
  35. //枚举根号n以内的质因数
  36. for(int i=0;i<pNum&&prime[i]<=sqr;i++){
  37. if(n%prime[i]==0){
  38. f[num].x=prime[i];
  39. f[num].count=0;
  40. while(n%prime[i]==0){
  41. f[num].count++;
  42. n/=prime[i];
  43. }
  44. num++;
  45. }
  46. if(n==1){
  47. break;
  48. }
  49. }
  50. //如果最终除不尽,则一定有且仅有一个大于根号n的质因子。
  51. if(n!=1){
  52. f[num].x=n;
  53. f[num++].count=1;
  54. }
  55. //打印
  56. for(int i=0;i<num;i++){
  57. if(i>0) printf("*");
  58. printf("%d",f[i].x);
  59. if(f[i].count>1){
  60. printf("^%d",f[i].count);
  61. }
  62. }
  63. }
  64. return 0;
  65. }

2019042020011028.png
这里说明一下(针对方法二):
1)考虑到2*3*5*7*11*13*17*19*23*29就已经超出了int范围,所以只需要将 f 数组开到10就可以了。
2)时间复杂度为O(√n)。

核心思路:
对于正整数n来说,如果它存在1和本身之外的因子,那么一定是在sqrt(n)的左右成对出现(或者就等于sqrt(n)^2)。
推广到“质因子”上面,会得到一个强化结论:
情况1.所有质因子≤sqrt(n).
情况2.一个质因子>sqrt(n),其余全部≤sqrt(n)。 在上述代码中,最后除不尽(不为1)则有且仅有一个大于sqrt(n)的数。

发表评论

表情:
评论列表 (有 0 条评论,362人围观)

还没有评论,来说两句吧...

相关阅读

    相关 因子分解

    概念:所谓质因子分解是将一个正整数n写成一个或多个质数的乘积形式。 例如:6=2\3,180=2\2\3\3\5,也可以写成指数形式,例如 180=2^2\3^2\5^1;