最大公约数和最小公倍数
分解质因数
完全平方数
package arithmetic;
/**
* 求最大公约数和最小公倍数
* 分解质因数 80=2*2*2*2*5
*
* 有1、2、3、4个数字,
* 能组成多少个互不相同且无重复数字的三位数?
* 都是多少?
*
* 一个整数,它加上100后是一个完全平方数,
* 加上168又是一个完全平方数,请问该数是多少?
*
* @author sunRainAmazing
*
*/
public class NumberDemo {
public static void main(String[] args) {
int a=63,b=28;
System.out.println(a+" , "+b +"的最大公约数为:"
+getCommonDivisor1(a,b));
System.out.println(a+" , "+b +"的最大公约数为:"
+getCommonDivisor(a,b));
System.out.println(a+" , "+b +"的最小公倍数为:"
+a*b/getCommonDivisor(a,b));
resolvePrime(80);
arrangeNumber();
getNumber();
}
/**
* 求两个数的最大公约数
* @param n
* @param m
* @return
*/
public static int getCommonDivisor(int n,int m){
while(true){
if((n%=m)==0)
return m;
if((m%=n)==0)
return n;
}
}
/**
* 返回 最大公约数 a
* @param a
* @param b
* @return
*/
public static int getCommonDivisor1(int a,int b){
if(a<b){
int temp=a;
a=b;
b=temp;
}
while((a%b)!=0){
a%=b;
if(a<b){
a+=b;
b=a-b;
a-=b;
}
}
return b;
}
/**
* 进行传入参数分解质因数
* 程序分析:对n进行分解质因数,应先找到一个最小的质数k,
* 然后按下述步骤完成:
* (1)如果这个质数恰等于n,
* 则说明分解质因数的过程已经结束,打印出即可。
* (2)如果n <> k,但n能被k整除,则应打印出k的值,
* 并用n除以k的商,作为新的正整数你n,重复执行第一步。
* (3)如果n不能被k整除,则用k+1作为k的值,
* 重复执行第一步。
* @param number
*/
public static void resolvePrime(int number){
System.out.print("分解质因数:"+number+"=");
int k=2;
while(k <= number){
if(k==number){
System.out.println(number);
break;
}else if(number%k==0){
System.out.print(k+"*");
number /= k;
}else{
k++;
}
}
}
/**
* 有1、2、3、4个数字,
* 能组成多少个互不相同且无重复数字的三位数?都是多少?
*/
public static void arrangeNumber(){
int i,j,k;
i=j=k=0;
int count=0;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
for(k=1;k<=4;k++)
if(i!=j && j!=k && i!=k){
count+=1;
System.out.println(i*100+j*10+k+"\t");
}
System.out.println ("\n经过排列组合后,有"+count+"个数");
}
/**
* 利用Math的相关方法进行测试
* 一个整数,它加上100后是一个完全平方数,
* 加上168又是一个完全平方数,请问该数是多少?
* Math.floor() 向下取整
* Math.sqrt() 取开方值
*/
public static void getNumber(){
long number=1;
for(;number<=10000000l;number++)
if( Math.floor(Math.sqrt(number+100))==Math.sqrt(number+100)
&& Math.floor(Math.sqrt(number+168))==Math.sqrt(number+168)){
System.out.println(number);
break;
}
}
}