n~m正整数约数个数最多的数

2024-06-21 05:08
文章标签 正整数 数最多 数个

本文主要是介绍n~m正整数约数个数最多的数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

    问题分析:

    首先以10、20、30这几个数的约数情况来分析约数的个数。

        10=2*5;10有1、2、5、10共4个约数;

        20=2^2*5;20有1、2、4、5、10、20共6个约数;

        30=2*3*5;30有1、2、3、5、6、10、15、30共8个约数。

 

    在上述三个数中,可以发现,每一个数都可以分解为若干个质数(素数)的乘积,而所有的约数中,除了1以外,其他所有的数都可以看成这些质数的乘积,而1可以看成是相关的质数的幂为0的情况。以10和20为例来说明这个问题:

    10的4个约数中,可以看成如下的情况:

        1=2^0*5^0

        2=2^1*5^0

        5=2^0*5^1

        10=2^1*5^1

    20的6个约数中,可以看成是如下的情况:

        1=2^0*5

        2=2^1*5^0

        4=2^2*5^0

        5=2^0*5^1

        10=2^1*5^1

        20=2^2*5^1

    从这两个例子中可以发现,如果可以确定相关质数的指数,则这个数的约数的个数为相关指数加1后相乘。如10的约数数目为(1+1)*(1+1)=4,20的约数数目为(2+1)*(1+1)=6。

    参考程序如下:


 
import java.util.Scanner;public class Q1_3 {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=Integer.valueOf(input.nextLine());int m=Integer.valueOf(input.nextLine());int t;if(n>m){t=n;n=m;m=t;}t=0;for (int i = n; i < m; i++) {      //得到约数最多的个数if(get(i)>t){t=get(i);}}for (int i = n; i < m; i++) {     //得到约数个数是最多的数if(get(i)==t){System.out.print(i+"   ");}}System.out.println();System.out.println(t);}public static int get(int n) {           //得到约数的个数int temp = 1,t=1;for (int i = 2; i <= n; i++) {for (int k = 0; k <= n;) {while (n % Math.pow(i, k) == 0) {k++;}if(t%i==0){break;}if (k >=2) {temp *= k;t*=Math.pow(i, k-1);}break;}if(t==n){break;}}return temp;}
}




这篇关于n~m正整数约数个数最多的数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080288

相关文章

【C++题解】1108 - 正整数N转换成一个二进制数

问题三:1108 - 正整数N转换成一个二进制数 类型:字符串、进制转换 题目描述: 输入一个不大于 32767 的整数 n ,将它转换成一个二进制数。 输入: 输入只有一行,包括一个整数 n (0≤n≤32767)。 输出: 输出只有一行。 样例: 输入: 100 输出: 1100100 输入: 0 输出: 0 完整代码如下: #inclu

正则 正整数bug

/^[0-9]{1,}(\.[0-9]{1,}){0,1}$/ 有一个情况是 要验证的数字是整数 但是实际上是 1.0这种形式, 如果是1.0的形式 使用这个正则是会报错的 /^[0-9]*[1-9][0-9]*$/ 可能是不认1.0 但是用最上面的那个正则就没事,可能是多了一层判断。 其实也是要注意把数字改了1.0为0就好了。

找出未出现的最小正整数

给定一个含n(n≥1)个整数的数组,找出数组中未出现的最小正整数。例如,数组{-5, 3, 2, 3}中未出现的最小正整数是1;数组{1, 2, 3}中未出现的最小正整数是4。 方法一: 思想。对数组进行快速排序,然后进行遍历数组。 ①第一个元素大于0,且不为1,则最后返回1;出现正数之前的元素为负数,且第一个正数不为1,则返回1。例如:-1,2,3;例如,2,3,4  ②现的正整数之间差

华为OD机试 - 分解连续正整数组合 - 数学推导(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。 一、题目描述

浙大版 输入一个正整数n(1≤n≤10),打印一个n行n列的方阵。当n=4时,打印如下方阵:

输入一个正整数n(1≤n≤10),打印一个n行n列的方阵。当n=4时,打印如下方阵: 观察首项都是n*(n-1)+1 每次换行后多减一个n 所以循环中i-=n #include<stdio.h>int main(){int i, j, n;//设三个整数scanf("%d", &n);//输入整数n的值for (i=n*(n-1); i >= 0;i-=n){//循环次数for (j =

本题要求编写程序,计算并输出2个正整数的和、差、积、商。题目保证输入和输出全部在整型范围内。

/* 题目描述 本题要求编写程序,计算并输出2个正整数的和、差、积、商。 题目保证输入和输出全部在整型范围内。  输入 输入在一行中给出2个正整数A和B。 输出 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 */  #include<stdio.h> #include<math.h>  int main() {     int num1,num2;     scan

求不超过N的正整数中因子最多的数

描述 Given an integer n, for all integers not larger than n, find the integer with the most divisors. If there is more than one integer with the same number of divisors, print the minimum one. 输入 One

算法9—两个巨大正整数相加

两个巨大整数相加,可能会造成溢出,或者它的大小已经超出基本数据类型的范围,所以,我们对巨大整数进行相加时,可以把它们转换成字符串,然后通过字符串的处理进行整数相加。 这里有两种做法:第一种,把整数存在一个字符数组里进行处理。代码如下: [java]  view plain copy public static String addThroughArray(String

给定正整数n,计算出n个元素的集合{1,2,....,n}可以划分为多少个不同的非空集合

给定正整数n,计算出n个元素的集合{1,2,....,n}可以划分为多少个不同的非空集合 附源代码: #include<iostream>using namespace std;int F(int n,int m){if(n<=2)return 1;if(m==1||n==m)return 1;elsereturn F(n-1,m-1)+m*F(n-1,m);}void main(

编写程序,采用辗转相除法求解两个正整数的最大公约数

--编写程序,采用辗转相除法求解两个正整数的最大公约数DECLARE @a int,@b intSELECT @a=12,@b=21DECLARE @temp intprint cast(@a as varchar(5))+'和'+cast(@b as varchar(5))+'的最大公约数是'if @a<@b --或者是select @temp=@a,@a=@b,@b=@tempb