质因子分解

  • 1 本身不是素数, 因此它没有质因子, 如果题目要求对 1 处理, 要特判;
  • 定义结构体存放质因子及其个数;
  • struct factor { int x, count;  // x为质因子, cnt为其个数
    }fac[10];   //2*3*5*7*11*13*17*19*23*29就会超过int范围, 因此在int型范围内的数, fac数组大小开到10就可以

    对于一个正整数n来说, 如果它存在1和本身之外的因子,那么一定是在sqrt(n)的左右成对出现;

  • 对于一个整数n来说, 如果它存在[2,n]范围内的质因子, 要么这些质因子全部小于等于sqrt(n),要么只存在一个大于sqrt(n)的质因子, 其余质因子全部小于等于sqrt(n);
  1. 枚举1 ~ sqrt(n)范围内的所有质因子p, 判断p是否是n的因子
    if (n % prime[i] == 0) {
        fac[num].x = prime[i];
        fac[num].count = 0;
        while (n % prime[i] == 0) {
            fac[num].count++;
            n /= prime[i];
        }
        num++; //不同质因子个数加1
    }

    2. 如果在上面步骤结束后n仍热大于1, 说明n有且仅有一个大于sqrt(n)的质因子(有可能是n本身),这时需要将其加入fac数组,并令其个数为1;

    if (n != 1) {
        fac[num].x = n;
        fac[num++].count = 1;
    }

    (来源:晴神的《算法笔记》)

猜你喜欢

转载自www.cnblogs.com/Yaxadu/p/9169162.html