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;
    }



  • 相关阅读:
    hadoop:WordCount问题总结
    .mata. _root_ (转)
    Hbase笔记:批量导入
    Hbase笔记4 java操作Hbase
    wget
    中国大陆开源镜像站汇总
    全键盘操作Windows
    linux下实用命令
    /dev/null和/dev/zero的区别
    Windows xp下安装sql server2005所碰到的一些问题及解决方法
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/2182737.html
Copyright © 2011-2022 走看看