【算法】最多约数问题两种方法

    科技2024-10-08  21

    最多约数问题 正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a和b之间约数个数最多的数x及其最多约数个数。

    方法一算法思想: 1.输入a、b; 2.利用两个循环分别求在输入的a、b之间的数的约数:设置总约数起始值为2(1和本身),分别对1-i求余,余数为0则总约数加1,比较每个数的总约数大小 3.输出最大值

    代码实现⬇

    #include <stdio.h> #include <stdlib.h> int main() { int a,b,x=0,i,k;//输入ab int n=2,m=1;//n:约数个数,m:最大约数个数 scanf("%d%d",&a,&b);//input for(i=a;i<=b;i++){ n=2; for(k=2;k<i;k++){ if(i%k==0) {n++;} if(n>m) {m=n;x=i;} } } printf("%d与%d之间约数个数最多的为:%d,约数为%d:",a,b,x,m); return 0; }

    方法二算法思想: 一个合数的约数个数等于它每个质因数的个数+1再相乘。 例如 12=223 约数个数=(2+1)*(1+1)=6 1.输入ab 2.判断2-i/2(a<i<b)是不是素数(质因数必是素数),判断是不是约数,如果是,统计个数存入数组,按公式求出约数个数 3.比较a-b间约数个数最大的,输出

    代码实现⬇

    #include<stdio.h> int sushu(int num)//判断这个数是不是质数 { int flag = 1; for(int i = 2;i < num / 2;i ++) { if(num % i == 0) { flag = 0; break; } } return flag; } int div(int num) { int count; int *result = new int[num + 1]; int temp = num; int total = 1; for(int i = 0;i < num + 1;i ++){ result[i] = 0; }//初始化 for(int i = 2;i <= num / 2;i ++) { if(sushu(i))//是素数 { if(temp % i == 0)//是质因数 { count = 0; while(temp % i == 0) { count ++;//质因数个数 temp = temp / i; } result[i] = count;//存入数组 } } } for(int i = 2;i <= num;i ++) { if(result[i] != 0) total = total * (result[i] + 1);//公式求约数个数 } return total; } int main() { int a,b; int m = 0; int temp; int x; scanf("%d%d",&a,&b); for(int i = a;i <= b;i ++) { temp = div(i);//各个数约数个数 if(temp > m){ m = temp; x=i;//求max } } printf("%d与%d之间约数个数最多的为:%d,约数为%d:",a,b,x,m); return 0; }
    Processed: 0.009, SQL: 8