最も約数の問題、数の約数を見つける

数学的分析

ad3ffff80b1943b5ac73ed10ed92d135.jpg

 二相関原理

https://m.baike.so.com/doc/3567228-3751425.html

3つの実践演習

最大約数問題

問題の説明: 正の整数 x の約数は、x を等分できる正の整数です。正の整数 x の約数は div(x) として記録されます。たとえば、1、2、3、および 10 はすべて正の整数 10 の約数であり、div(10)=4 です。a と b が 2 つの正の整数 (a<=b) であると仮定し、a と b の間で最大の除数を持つ数 x を見つけます。

以下は、C言語での実装を示しています

1. 素数を生成する関数

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

2. 約数が最も多い関数を探す

void search(int from,int tot,int num,int low,int up){
	if(num>=1)
		if((tot>max)||((tot==max)&&(num<numb))){
			max=tot;
			numb=num;
		}
	if((low==up)&&(low>num))
		search(from,tot*2,num*low,1,1);
	for(int i=from;i<=PCOUNT;i++){
		if(prim[i]>up)
			return;
		else{
			int j=prim[i],x=low1,y=up,n=num,t=tot,m=1;
			while(ture){
				m++;
				t+=tot;
				x/=j;
				y/=j;
				if(x==y)
					break;
				n*=j;
				search(i+1,t,n,x+1,y);}
		}
		m=1<<m;
		if(tot<max/m)
			return;
	}
}

3. 主な機能

int main(){
    primes();
    cin>>l>>u;
    if((l==1)&&(u==1)){
        max=1;
        numb=1;
    }
    else{
        max=2;
        numb=1;
        search(1,1,1,l,u);
		}
	cout<<max<<end1;
		return 0;
	}

おすすめ

転載: blog.csdn.net/m0_65485230/article/details/129308394