最多约数问题

来源:互联网 发布:淘宝开通花呗要求什么 编辑:程序博客网 时间:2024/06/05 04:36

问题描述:正整数x的约数是能整除x的正整数。正整数x的约数个数记为div(x)。例如,10有4个约数:1、2、5、10。设a和b是两个正整数,试计算a和b之间约数个数最多的数x。

算法设计:对于给定的2个正整数a≤b,编程计算a 和 b 之间约数个数最多的数。 

数据输入:输入数据由文件名为input.txt的文本文件提供。文件的第1 行有2 个正整数 a和 b。 
结果输出: 若找到的a和b之间约数个数最多的数是x,则将div(x)输出到文件output.txt。

问题分析:任何一个数都能分解成几个素数乘积的形式,例如6的约数有1,2,3,6,且6分解成素数相乘6=2*3,在比如36的约数有1,2,3,4,6,9,12,18,36,且36分解成素数相乘36=2*2*3*3=2^2*3^2,通过规律我们可以发现一个数约数的个数等于它分解成素数相乘后各素数指数加一的乘积,像36约数个数就直接可以以(2+1)*(2+1)=9个来计算。

#include<stdio.h>#include<math.h>
int prime(int n){for(int i=2;i<n;i++)if(n%i==0)return 0;return 1;}int main(){int a,b;int result,maxvalue=-9999;int temp,count;scanf("%d%d",&a,&b);for(int i=a;i<=b;i++){temp=i;result=1;for(int j=2;j<i;j++){if(prime(j)){count=0;while(temp%j==0){count++;temp/=j;}result*=count+1;}} if(result>maxvalue)maxvalue=result;}printf("%d\n",maxvalue);return 0;}