⑴ 用java求两数的最大公约数和最小公倍数
这段代码是用来求最大公约数最小公倍数的程序,采用的是辗转相除算法!(注:这段程序有不足这处,没有加以判断所有的异常情况,只是把输入的数为负处理了,但还有几种情况就是:如果两个数都是质数,则没有公约数,如有一个是质数,并且与另一个数没倍数关系则也不能处理,还是第三种情况就是两数虽然不是质数,它也可能没有最大公约数,21和20这样的数.在所有讲语言的教材中讲到的用辗转相除法算法求此问题都没有考虑到这几种情况,我们要注意这点,它只能处理有最大公约数和最小公倍数的两数!)
import java.io.*;
public class shili
{public static void main(String[] args)
{int a=0;
a:
System.out.print("请输入一个数a:");
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
a=Integer.parseInt(br.readLine());
}catch(IOException ex){}
int b=0;
System.out.print("请输入另一个数b:");
try
{BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
b=Integer.parseInt(br.readLine());
}catch(IOException ex){}
if(a<=0||b<=0)
System.out.println("你输入的数不合法,将会出现错误!");
int ab=a*b;
int r=0;
if(a<b)
{r=a;
b=a;
a=r;}
int i=1;
while(i!=0)
{i=a%b;
a=b;
b=i;
}
System.out.println("你输入的两数的最大公约数为:"+a);
System.out.println("你输入的两数的最小公倍数为:"+ab/a);
}
}
⑵ java最大公约数算法
三种算法:
//欧几里得算法(辗转相除):
public static int gcd(int m,int n) {
if(m<n) {
int k=m;
m=n;
n=k;
}
//if(m%n!=0) {
// m=m%n;
// return gcd(m,n);
//}
//return n;
return m%n == 0?n:gcd(n,m%n);
}
//连续整数检测算法:
public static int gcd1(int m,int n) {
int t;
if(m<n) {
t=m;
}else {
t=n;
}
while(m%t!=0||n%t!=0){
t--;
}
return t;
}
//公因数法:(更相减损)
public static int gcd2(int m,int n) {
int i=0,t,x;
while(m%2==0&n%2==0) {
m/=2;
n/=2;
i++;
}
if(m<n){
t=m;
m=n;
n=t;
}
while(n!=(m-n)) {
x=m-n;
m=(n>x)?n:x;
n=(n<x)?n:x;
}
if(i==0)
return n;
else
return (int)Math.pow(2, i)*n;
}
public static void main(String[] args) {
System.out.println("请输入两个正整数:");
Scanner scan = new Scanner(System.in);
Scanner scan2=new Scanner(System.in);
int m=scan.nextInt();
int n=scan2.nextInt();
System.out.println("欧几里得算法求最大公约数是:"+gcd(m,n));
System.out.println("连续整数检测算法求最大公约数是:"+gcd1(m,n));
System.out.println("公因数法求最大公约数是:"+gcd2(m,n));
}
}
⑶ java编写求最大公约数和最小公倍数的程序
输入两个正整数m和n, 求其最大公约数和最小公倍数.
用辗转相除法求最大公约数
算法描述:
m对n求余为a, 若a不等于0
则 m <- n, n <- a, 继续求余
否则 n 为最大公约数
最小公倍数 = 两个数的积 / 最大公约数
#include
int main()
{
int m, n;
int m_cup, n_cup, res; /*被除数, 除数, 余数*/
printf("Enter two integer:\n");
scanf("%d %d", &m, &n);
if (m > 0 && n >0)
{
m_cup = m;
n_cup = n;
res = m_cup % n_cup;
while (res != 0)
{
m_cup = n_cup;
n_cup = res;
res = m_cup % n_cup;
}
printf("Greatest common divisor: %d\n", n_cup);
printf("Lease common multiple : %d\n", m * n / n_cup);
}
else printf("Error!\n");
return 0;
}
★ 关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下:
约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。
辗转相除法求最大公约数,是一种比较好的方法,比较快。
对于52317和75569两个数,你能迅速地求出它们的最大公约数吗?一般来说你会找一找公共的使因子,这题可麻烦了,不好找,质因子大。
现在教你用辗转相除法来求最大公约数。
先用较大的75569除以52317,得商1,余数23252,再以52317除以23252,得商2,余数是5813,再用23252做被除数,5813做除数,正好除尽得商数4。这样5813就是75569和52317的最大公约数。你要是用分解使因数的办法,肯定找不到。
那么,这辗转相除法为什么能得到最大公约数呢?下面我就给大伙谈谈。
比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1我们当然也可以把上面这个式子改写成乘法式:a=bq1+r1------l)
如果r1=0,那么b就是a、b的最大公约数3。要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:
b=r1q2+r2-------2)
如果余数r2=0,那么r1就是所求的最大公约数3。为什么呢?因为如果2)式变成了b=r1q2,那么b1r1的公约数就一定是a1b的公约数。这是因为一个数能同时除尽b和r1,那么由l)式,就一定能整除a,从而也是a1b的公约数。
反过来,如果一个数d,能同时整除a1b,那么由1)式,也一定能整除r1,从而也有d是b1r1的公约数。
这样,a和b的公约数与b和r1的公约数完全一样,那么这两对的最大公约数也一定相同。那b1r1的最大公约数,在r1=0时,不就是r1吗?所以a和b的最大公约数也是r1了。
有人会说,那r2不等于0怎么办?那当然是继续往下做,用r1除以r2,……直到余数为零为止。
在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。
⑷ 用Java语言求m,n的最大公约数,三种方法
1.从1开始循环。分别求出m、n的约数。找出最大公约数。
2.判断m、n的大小,从较小的开始循环,每次减一,判断是否为公约数。如果是,则为最大公约数,break;
3.2反过来,从小到大循环,找最大的。
公约数判断:
m%i=0&&n/i=0。
举第二个例子:
public
class
Test
{
public
static
int
getN(int
m,int
n){
int
i
=
m>n?n:m;
for(;i>0;i--){
if(m%i==0&&n%i==0){
System.out.println("m、n的最大公约数为"+i);
break;
}
}
return
i;
}
public
static
void
main(String[]
args)
{
System.out.println(getN(100,
88));
}
}
⑸ 用java从键盘输入两个正整数,求他们的最大公约数
从键盘输入那么就会用到Java的Scanner类,最大公约数,这里会用到算法,网络上面也有,下面是其中一种:
importjava.util.Scanner;
publicclassTestDivisor{
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);//新建一个输入流对象,这里会导包
System.out.println("请输入第一个数:");
intnum1=input.nextInt();//接收输入的整数
System.out.println("请输入第二个数:");
intnum2=input.nextInt();//接收输入的整数
intnum3=num1%num2;//num1跟num2取余得到num3
while(num3>0){
num1=num2;
num2=num3;
num3=num1%num2;
}
input.close();//关闭输入流
System.out.println("最大公约数是:"+num2);
}
}
/**
GCD算法的实现--GCB是最大公约数缩写
2.1递归实现
intgcd(inta,intb)
{
if(!b)returna;
elsereturngcd(b,a%b);
}
2.2迭代实现
intgcd(inta,intb)
{
intc=a%b;
while(c){
a=b;
b=c;
c=a%b;
}
returnb;
}
*
*/
⑹ 求 最大公约数 Java
可以直接用hoe,一个Java基础操作库,里面有最大公约数和最小公倍数的算法
//最大公约数
System.out.println(NumberHoe.gcd(2,8));//result=2
System.out.println(NumberHoe.gcd(12,16,40));//result=4
//最小公倍数
System.out.println(NumberHoe.lcm(2,3));//result=6
System.out.println(NumberHoe.lcm(2,6,22));//result=66
源码如下
https://github.com/caspar-chen/hoe/blob/master/src/main/java/com/caspar/hoe/NumberHoe.java
⑺ 已知一个固定长度的整型数组,写出求所有整数最大公约数的算法,用JAVA来实现,跪求答案
import java.util.Arrays;
public class GreateComD {
public static void main(String[] args) {
// int[] ary = {13, 25, 121, 136, 296, 358};
int[] ary = {24, 56, 8, 64, 128};
int min = ary[0];
for(int i = 0; i < ary.length; i++){
if(ary[i] < min){
min = ary[i];
}
}
while(min >= 1){
boolean isCommon = true;
for(int i = 0; i < ary.length; i++){
if(ary[i] % min != 0){
isCommon = false;
break;
}
}
if(isCommon){
System.out.println(min);
break;
}
min--;
}
System.out.println(Arrays.toString(ary) + ": 最大公约数为: " + min);
}
}