zoukankan      html  css  js  c++  java
  • 求N的所有因子(约数)

    #include<stdio.h>
    #include
    <math.h>
    #include
    <string.h>
    #include
    <stdlib.h>
    #define nmax 100000
    int prime[nmax], flag[nmax], factor[nmax], cfactor[nmax], divisor[nmax];
    int plen, flen, dlen;
    void init() {
    memset(flag,
    -1, sizeof(flag));
    int i, j;
    for (i = 2, plen = 0; i < nmax; i++) {
    if (flag[i]) {
    prime[plen
    ++] = i;
    }
    for (j = 0; (j < plen) && (i * prime[j] < nmax); j++) {
    flag[i
    * prime[j]] = 0;
    if (i % prime[j] == 0) {
    break;
    }
    }
    }
    }
    void findFactor(int n) {
    int i, te, cnt;
    te
    = (int) (sqrt(n * 1.0));
    for (i = 0, flen = 0; (i < plen) && (prime[i] <= te); i++) {
    if (n % prime[i] == 0) {
    cnt
    = 0;
    while (n % prime[i] == 0) {
    cnt
    ++;
    n
    /= prime[i];
    }
    factor[flen]
    = prime[i];
    cfactor[flen]
    = cnt;
    flen
    ++;
    }
    }
    if (n > 1) {
    factor[flen]
    = n;
    cfactor[flen]
    = 1;
    flen
    ++;
    }
    }
    void dfs(int k, int now) {
    if (k == flen) {
    divisor[dlen
    ++] = now;
    return;
    }
    int i;
    for (i = 0; i < cfactor[k]; i++) {
    now
    = now * factor[k];
    dfs(k
    + 1, now);
    }
    for (i = 0; i < cfactor[k]; i++) {
    now
    = now / factor[k];
    }
    dfs(k
    + 1, now);
    }
    int cmp(const void *a, const void *b) {
    return *(int *) a - *(int *) b;
    }
    int main() {
    #ifndef ONLINE_JUDGE
    freopen(
    "data.in", "r", stdin);
    #endif
    init();
    int n, i;
    while (~scanf("%d", &n)) {
    findFactor(n);
    dlen
    = 0;
    dfs(
    0, 1);
    qsort(divisor, dlen,
    sizeof(divisor[0]), cmp);
    for (i = 0; i < dlen; i++) {
    printf(
    "%d ", divisor[i]);
    }
    printf(
    "\n");
    }
    return 0;
    }

    另一种方法为:

    #define nmax 31625
    #define fac 50005
    map<int, int> mymap;
    int prime[nmax], plen, factor[fac], pfactor[fac], cpfactor[fac], len_pfactor,
    len_factor;
    void dfs(int p, int c, long long nn, int n) {
    int i, r;
    long long te;
    for (i = p; i < len_pfactor; i++) {
    if (c > cpfactor[i]) {
    dfs(i + 1, 0, nn, n);
    }
    te = nn * pfactor[i];
    if (te >= n) {
    return;
    }
    r = (int) te;
    if (n % r == 0) {
    if (!mymap[r]) {
    factor[len_factor++] = r;
    mymap[r] = 1;
    }
    }
    dfs(i, c + 1, te, n);
    }
    }
    solve(n);
    factor[0] = 1;
    len_factor = 1;
    mymap.clear();
    dfs(0, 0, 1, n);
    if (n != 1) {
    factor[len_factor++] = n;
    }



  • 相关阅读:
    主键、外键、复合外键的创建
    DbHelper and OracleHelper
    Oracle 给表添加主键和使ID自增、触发器、创建结构一样的表
    Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字
    ASP.NET MVC 基础
    5. CSS新特性之浏览器私有前缀
    JavaScript-----15.简单数据类型和复杂数据类型
    JavaScript-----14.内置对象 Array()和String()
    JavaScript-----13.内置对象 Math()和Date()
    JavaScript-----12.对象
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/2182737.html
Copyright © 2011-2022 走看看