• 13 最多约数问题


    问题描述: 
    正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a和b之间约数个数最多的数x。 
    问题简化: 
    对于给定的2个正整数a≤b,编程计算a 和 b 之间约数个数最多的数。

    思想:设正整数x的质因子分解为
    x=p1^N1 × p2^N2 ×……pi^Ni
    则 div(x)=(N1+1)(N2+1)……(Ni+1)

    源代码如下:

    #include <stdio.h>

    #define MAXP 10240
    #define true 1
    #define false 0;

    int prim[MAXP];
    int get[MAXP];
    int total;
    void prime()
    {
    int get[MAXP+1];
    int i, ii, j;
    for( i = 2; i < MAXP; i++) {
    get[i] = true;
    }
    for (i = 2; i <= MAXP; i++) {
    if (get[i]) {
    j = i + i;
    }
    while (j <= MAXP) {
    get[j] = false;
    j += i;
    }
    }
    for (ii = 2, total = 0; ii <= MAXP; ii++) {
    if (get[ii]) {
    prim[total++] = ii;
    }
    }
    }

    int div(int n) {
    int i = 0;
    int count = 1;
    int temp = n;
    int t = 0;

    if (n == 1 ) {
    return 1;
    }
    if (get[n]) {
    return 2;
    }
    while (prim[i] <= n/2) {
    if (temp % prim[i] == 0) {
    t++;
    temp /= prim[i];
    }
    else if (t == 0) {
    i++;
    }
    else {
    count *= (t + 1);
    i++;
    t = 0;
    }
    }
    return count;
    }

    int main()
    {
    int a, b;
    int i;
    prime();
    while(scanf("%d%d", &a, &b) != EOF) {
    int max = 0;
    int num = 0;
    for (i = a; i <= b; i++) {
    if ( max < div(i) ) {
    max = div(i);
    num = i;
    }
    }
    printf("%d : %d\n", num, max);
    }
    return 0;
    }

  • 相关阅读:
    Python远程连接主机之paramiko模块
    品德养成记
    打包命令tar
    Linux内存信息查看——free命令
    机器学习之线性代数
    Linux用户信息查询
    tcpdump命令
    netstat命令
    LED的基本认识与STC89C52中的LED
    keil新建工程及工程设置
  • 原文地址:https://www.cnblogs.com/taotao315/p/2951543.html
Copyright © 2020-2023  润新知