最多约数问题

#include "stdio.h"
#include "string.h"

const int MAXP = 316;
const int PCOUNT = 34;
int prim[PCOUNT]; //存储素数
bool get[PCOUNT];

//素数筛法
void prims()
{   
    memset(prim, 0, sizeof(prim));
    int i;
    for(i=0; i<=MAXP; i++)
        get[i] = true; 
    int j;
    for(i=2; i<=MAXP; i++)
        if(get[i])
        {
            j = i + i;
            while(j<=MAXP)
            {
                get[j] = false; //如果是i的倍数,就一定不是素数
                j += i;
            }
        }
    int count = 0;
    for(i=2; i<=MAXP; i++)
        if(get[i])
            prim[count++] = i;
}

//返回x中的约数个数
//x = p1^N1 * p2^N2 + ... + pK^NK
//div(x) = (N1+1)*(N2+1)*...*(NK+1)
int div(int x)
{
    int count;
    int sum = 1;
    int i;
    for(i=0; i<=MAXP && prim[i]<=x; i++)
    {
        count = 1;  
        if(x%prim[i]==0) 
        {
            while(x%prim[i]==0)
            {
                count++;
                x /= prim[i];
            }
            sum *= count;
        }   
    }
    return sum;
}

int main()
{
    prims();
    int i;
    int low, high;
    printf("请输入两个正整数:\n");
    scanf("%d", &low);
    scanf("%d", &high);
    int max = 0;
    int count = 0;
    for(i=low; i<=high; i++)
    {
        count = div(i);
        if(count>max)
            max = count;
    }
    printf("两个正整数之间约数个数最多的数中有%d个约数\n", max);
    return 0;
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值