约数个数定理
对于一个大于1正整数n可以分解质因数:
(质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数)
则n的正约数的个数就是
其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。
例题: (暂时只看第一问,该题完整答案https://wenku.baidu.com/view/33e7804169eae009581becf4.html)
编程问题 :寻找最多[a,b]之间的最多约数问题
x为[a,b]中间拥有最多约数的数字,要求 a<=b
输入 x拥有的数字
#include<iostream>
#include<stdio.h>
using namespace std;
//返回整数[0,n]内拥有的质素数组
int* prime(int n){
int *primes = new int [n];
int count = 1;
//质素大于 1
bool flag = true;
for(int i = 2;i < n;i++){
for(int j = 2;j <= i/2;j++)
if( i % j == 0 ){
flag = false;
break;
}
if(flag)
primes[count++] = i;
else{
flag = true;
}
}
primes[0] = count;
return primes;
}
//返回参数 (整数)n , 拥有的约数个数
int count(int n,int *primes){
int *a = new int [n/2];
int count = 0;
for(int i = 1;n != 1 && i < primes[0];){
if(n % primes[i] == 0){
n = n / primes[i];
a[count++] = primes[i];
}
else
i++;
}
int tmp = 1;
int sum = 1;
for(int i = 0;i < count;i++){
if(a[i] == a[i+1])
tmp++;
else{
sum *= (tmp+1);
tmp = 1;
}
}
return sum;
}
int main(){
FILE *stream_1,*stream_2;
stream_1 = fopen("D:\\input.txt","r");
stream_2 = fopen("D:\\output.txt","w+");
int a,b,c;
fscanf(stream_1,"%d %d",&a,&b);
int *primes = prime(b);
if(a>b)
cout<<"Unable a>b/n";
else if(a == b )
c = count(a,primes);
else{
int x = 0;
int tmp = 0;
for(int i = a;i <= b; i++) {
int t = count(i,primes);
if(tmp < t )
x = i,tmp = t;
}
c = tmp;
}
fprintf(stream_2,"%d",c);
fclose(stream_1);
fclose(stream_2);
return 0;
}